读取文件并将文件内容导入数据库

很多时候我们需要把一个文件按行读取出来,并把读出的内容插入到数据库对应的字段,我们可以写个方法,规定从文件第几行读取,文件中不同字段间的分隔符是什么,以及插入数据库中对应表的列数。当然这其中文件有的字段可能为空,这可能导致我们每行分隔文件后的字段数和数据库中的字段数不对应,所以也要进一步的处理。以下文的文件格式为例(此文件字段间以TAB键分割),把其按行读取并插入数据库。

客户代码 收货人代码 产品代码 最少发货数量 发货单位 添加日期 添加人

C00001   R00001   P000001  10    件   2011-11-08    joeleo

C00001   R00002   P000002  30    件            

C00001   R00003   P000003  40    件

C00001   R00003   P000003  40    件

C00001   R00003   P000003  40    件   2011-11-08    joeleo

C00001   R00003   P000003  40    件

  1 ///<summary>
2 /// 按行读取文件里的内容并插入到数据库
3 ///</summary>
4 ///<param name="fileFullPath"></param>
5 ///<param name="startLine"></param>
6 ///<param name="splitter"></param>
7 ///<param name="columnCount"></param>
8 ///<param name="encodingName"></param>
9 ///<returns></returns>
10 public void ReadFileBySplitterInOneLine(string fileFullPath, int startLine, string splitter, int columnCount, string encodingName)
11 {
12 StreamReader sr = new StreamReader(fileFullPath, encodingName.Length == 0 ? Encoding.Default : Encoding.GetEncoding(encodingName));
13 string lineText = "";
14
15 for (int i = 0; i < startLine; i++)
16 {
17 sr.ReadLine();
18 }
19
20 //从起始行开始获取内容
21 while ((lineText = sr.ReadLine()) != null)
22 {
23 string allFields = "";
24 string[] lineArray = lineText.Split(new string[] { splitter }, StringSplitOptions.None); //此时按分隔符截取文件的内容,文件中对应数据库的字段有可能为空,导致每行分割的数量小于数据库中要插入的字段数量,我们要进一步处理让分割的数量达到要插入数据库中的列数
25 for (int i = 0; i < columnCount; i++)
26 {
27 if (lineArray.Length > i)
28 {
29 allFields += lineArray[i].Trim() + "+|+";
30 }
31 else
32 {
33 allFields += "+|+";
34 }
35 }
36 allFields = allFields.Substring(0, allFields.Length - 3);
37 if (allFields.Replace("+|+", "").Trim().Length > 0)
38 {
39 string[] strTemp = allFields.Split(new string[] { "+|+" }, StringSplitOptions.None);
40 string cmdStr = "insert into MinSend (ClientCode,ReceiverCode,ProductCode,MinSendCount,SendUnit,AddDate,AddPerson) values(@ClientCode,@ReceiverCode,@ProductCode,@MinSendCount,@SendUnit,@AddDate,@AddPerson)";
41 SqlParameter[] parameters1 = {
42 new SqlParameter("@ClientCode",SqlDbType.VarChar,20),
43 new SqlParameter("@ReceiverCode",SqlDbType.VarChar,30),
44 new SqlParameter("@ProductCode",SqlDbType.VarChar,30),
45 new SqlParameter("@MinSendCount",SqlDbType.Int),
46 new SqlParameter("@SendUnit",SqlDbType.VarChar,10),
47 new SqlParameter("@AddDate",SqlDbType.DateTime),
48 new SqlParameter("@AddPerson",SqlDbType.VarChar,20)
49 };
50 parameters1[0].Value = strTemp[0].ToString();
51 parameters1[1].Value = strTemp[1].ToString();
52 parameters1[2].Value = strTemp[2].ToString();
53 parameters1[3].Value = strTemp[3].ToString();
54 parameters1[4].Value = strTemp[4].ToString();
55
56 if (strTemp[5].ToString() == "")
57 {
58 parameters1[5].Value = DateTime.Now;
59 }
60 else
61 {
62 parameters1[5].Value = DateTime.Parse(strTemp[5].ToString());
63 }
70 parameters1[6].Value = strTemp[6].ToString();

72 ExecuteNonQuery(cmdStr, CommandType.Text, parameters1);
73
74 }
75 }
76 Console.WriteLine("导入成功!");
77 sr.Close();
78 sr.Dispose();
79 }
80
81 ///<summary>
82 /// 对数据库执行增删改操作
83 ///</summary>
84 ///<param name="commandText">要执行的SQL语句</param>
85 ///<param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
86 ///<param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
87 ///<returns>返回执行操作受影响的行数</returns>
88 private static void ExecuteNonQuery(string commandText, CommandType commandType, SqlParameter[] parameters)
89{
90 int count = 0;
91 string connectionString = "Data Source=.;Initial Catalog=Send;User ID=sa;Password=123;Pooling=true;Min Pool Size=10;Max Pool Size=200 ";
92 using (SqlConnection connection = new SqlConnection(connectionString))
93 {
94 using (SqlCommand command = new SqlCommand(commandText, connection))
95 {
96 command.CommandType = commandType;//设置command的CommandType为指定的CommandType
97 //如果同时传入了参数,则添加这些参数
98 if (parameters != null)
99 {
100 foreach (SqlParameter parameter in parameters)
101 {
102 command.Parameters.Add(parameter);
103 }
104 }
105 connection.Open();//打开数据库连接
106 count = command.ExecuteNonQuery();
107 command.Parameters.Clear();
108 }
109 }
110 //return count;//返回执行增删改操作之后,数据库中受影响的行数
111 }



posted @ 2011-11-10 23:53  joeleo  阅读(1189)  评论(0编辑  收藏  举报