我已经将Excel文件读取到DataTable,但只有第一行填充了整个MS Access数据库。我已确认DataTable和Excel文件中的数据是相同的。我的代码如下所示:
using (OleDbConnection myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + outFilePath + ";Extended Properties=dBase IV"))
{
OleDbCommand cmd = new OleDbCommand();
string line = "001";
for (int n = 0; n < dt.Rows.Count; ++n)
{
if (String.IsNullOrEmpty(dt.Rows[n].Field<string>(0))) break;
cmd.CommandText = "INSERT INTO " + FileName +
"([JNL],[LINE],[TYPE],[DRACC],[CRACC],[EXPDRACC],[EXPCRACC]," +
"[DOCDATE],[REF],[DRAMT],[CRAMT]) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
string inacc = dt.Rows[n].Field<string>(0);
string justNumbers = new String(inacc.Where(Char.IsDigit).ToArray());
string acc = String.Format("{0:##-######-#}", justNumbers);
string jnl = JNL;
string Ref = REF;
string type = TYPE;
int dramt = 0;
int cramt = 0;
if (type == "50") dramt = Convert.ToInt32(100 * dt.Rows[n].Field < double>(2));
else cramt = Convert.ToInt32(100 * dt.Rows[n].Field < double>(2));
cmd.Parameters.Add("@JNL", OleDbType.VarChar).Value = jnl;
cmd.Parameters.Add("@LINE", OleDbType.VarChar).Value = line;
cmd.Parameters.Add("@TYPE", OleDbType.VarChar).Value = type;
cmd.Parameters.Add("@DRACC", OleDbType.VarChar).Value = justNumbers;
cmd.Parameters.Add("@CRACC", OleDbType.VarChar).Value = justNumbers;
cmd.Parameters.Add("@EXPDRACC", OleDbType.VarChar).Value = acc;
cmd.Parameters.Add("@EXPCRACC", OleDbType.VarChar).Value = acc;
cmd.Parameters.Add("@DOCDATE", OleDbType.Date).Value = DateTime.Now;
cmd.Parameters.Add("@REF", OleDbType.VarChar).Value = Ref;
cmd.Parameters.Add("@DRAMT", OleDbType.Integer).Value = dramt;
cmd.Parameters.Add("@CRAMT", OleDbType.Integer).Value = cramt;
cmd.CommandType = CommandType.Text;
cmd.Connection = myCon;
myCon.Open();
cmd.ExecuteNonQuery();
myCon.Close();
}
}
如何解决此类问题?
答案 0 :(得分:0)
您必须从命令中删除参数。您正在为其添加更多参数。使用
cmd.Parameters.Clear();
作为for
声明的第一行。
添加第一组参数并重复使用相同的命令而不清除它们,因此最终得到一个具有n*11
(参数定义/循环)的命令。
collection中的第一个匹配用于替换您的命令参数,以便您获得具有相同数据的n
条目。