首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#如何将CSV内容导入到SQL数据库中

2013-12-11 
C#怎么将CSV内容导入到SQL数据库中private void button1_Click(object sender, EventArgs e){subImportCsv

C#怎么将CSV内容导入到SQL数据库中


private void button1_Click(object sender, EventArgs e)
        {
            subImportCsv_Dataset("C:\\data\", "AHU1_数据记录0.csv");
        }
        public void subImportCsv_Dataset(string filePath, string fileName)
        {
            string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=";
            strConn += filePath;//这个地方只需要目录就可以了                                                      
            strConn += ";Extensions=asc,csv,tab,txt;";
            OdbcConnection objConn = new OdbcConnection(strConn);

            try
            {
                string strSQL = "select * from " + fileName;//文件名,不要带目录
                OdbcDataAdapter da = new OdbcDataAdapter(strSQL, objConn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

这是我自己写的读取CSV文件的程序但是要怎么插入数据到数据库中呢,数据库表中的列和CSV列是同结构的。
[解决办法]
bulk insert 
[解决办法]
c#有读取CSV文件的功能
下面这个是我前几天些的一个函数:
  #region csv文件操作
        public static DataSet dataset_csv(string sql,string fileurl)
        {
            OleDbConnection oleconn = new OleDbConnection();
            OleDbCommand olecmd = new OleDbCommand();
            OleDbDataAdapter oleadp;
            DataSet csvdataset;
            oleconn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+fileurl+";Extended Properties='Text;FMT=Delimited;HDR=YES;'";
            using (oleadp = new OleDbDataAdapter(sql, oleconn))
            {
                using (csvdataset = new DataSet("csv"))
                {
                    oleadp.Fill(csvdataset, "csvtable");
                    return csvdataset;
                }
            }
            olecmd.Dispose();


            oleconn.Close();
        }
        #endregion


[解决办法]
可以用SqlBulkCopy(using System.Data.SqlClient):

 /// <summary>
        /// 将DataTable导入SqlServer数据库
        /// </summary>
        /// <param name="dt">DataTable数据</param>
        /// <param name="strIP">数据库ip</param>
        /// <param name="strDatabase">数据库名</param>
        /// <param name="strUserId">用户名</param>
        /// <param name="strPwd">密码</param>
        /// <param name="strTableName">要导入的表名</param>
        /// <returns>错误信息(无错误返回空字符串)</returns>
        public string DataTableToSqlServer(DataTable dt,string strIP,string strDatabase,string strUserId,string strPwd,string strTableName)
        {
            string strError = "";
            SqlBulkCopy SqlBulk = new SqlBulkCopy("Data Source=" + strIP + ";Initial Catalog=" + strDatabase + ";User Id=" + strUserId + ";Password=" + strPwd + ";");
            SqlBulk.DestinationTableName = strTableName;
            try
            {
                SqlBulk.WriteToServer(dt);
            }
            catch(Exception ex)
            {
                strError = ex.Message + ":" + ex.StackTrace;
            }
            finally
            {
                SqlBulk.Close();
            }
            return strError;
        }

DataTable中列的数据类型要和sqlserver中的列类型一一对应。
[解决办法]

private static bool csvToSql(string fileName)
        {
            string StrConn = "server=.;database='" + DataBaseName + "';uid='" + userName + "';pwd='" + Password + "'";

            SqlConnection connection = new SqlConnection(StrConn);

            try
            {
                connection.Open();

                string cmdtxt = @"bulk insert " + TableName + " from '" + FilePath + fileName + "' with(FIRE_TRIGGERS,FIELDTERMINATOR=',')";

                SqlCommand cmd = new SqlCommand(cmdtxt, connection);

                cmd.ExecuteNonQuery();

                return true;
            }
            catch (System.Exception ex)
            {
               // log.WriteLine("文件:{0}  error:{1}", fileName, ex.Message);
               // log.Flush();
                return false;
            }

        }





[解决办法]
加断点先看看,你写的这个连接字符串是否正确。如果正确,然后看你写的这个
cmdtxt 是否正确,
bulk insert Table from 你的这个Table应该是要插入的表明
[解决办法]
public DataSet subImportCsv_Dataset(string filePath, string fileName)
        { 
            string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=";
            strConn += filePath;//这个地方只需要目录就可以了                                                      
              strConn += ";Extensions=asc,csv,tab,txt;";
            OdbcConnection objConn = new OdbcConnection(strConn);

            try
            {
                string strSQL = "select * from " + fileName;//文件名,不要带目录
                  OdbcDataAdapter da = new OdbcDataAdapter(strSQL, objConn);
                DataSet ds = new DataSet();
                da.Fill(ds); 
                return ds;
                
            }
            catch (Exception ex)
            {
                throw ex;
                 return null;
            }
        }


public int UpdateResult(DataSet ds)

              int icount=0;
              SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=
[解决办法]
DataDirectory
[解决办法]
\\Database1.mdf;Integrated Security=True;User Instance=True");
            con.Open();
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlParameter p = new SqlParameter("@VarName", SqlDbType.NVarChar);
            cmd.Parameters.Add(p);
            p = new SqlParameter("@TimeString", SqlDbType.NVarChar);
            cmd.Parameters.Add(p);
            p = new SqlParameter("@VarValue", SqlDbType.NVarChar);
            cmd.Parameters.Add(p);
            p = new SqlParameter("@Validity", SqlDbType.NVarChar);
            cmd.Parameters.Add(p);
            p = new SqlParameter("@Time_ms", SqlDbType.NVarChar);
            cmd.Parameters.Add(p);
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                cmd.Parameters["@VarName"].Value = ds.Tables[0].Rows[i]["VarName"].ToString();
                cmd.Parameters["@TimeString"].Value = ds.Tables[0].Rows[i]["TimeString"].ToString();
                cmd.Parameters["@VarValue"].Value = ds.Tables[0].Rows[i]["VarValue"].ToString();
                cmd.Parameters["@Validity"].Value = ds.Tables[0].Rows[i]["Validity"].ToString();


                cmd.Parameters["@Time_ms"].Value = ds.Tables[0].Rows[i]["Time_ms"].ToString();
                  conn.Open();
                  if(cmd.ExecuteNonQuery()>0)   
icount++;          cmd.Close();           
 }


打开关闭应该放在循环内做

热点排行