插入数据表以使用 c# 访问数据库

本文关键字:访问 数据库 数据表 插入 | 更新日期: 2023-09-27 18:37:11

我尝试了几个代码来在Access数据库中插入DataTable。下面是代码:

public void WriteToAccess(DataTable dt)
        {
            string strDSN = "DSN=MYDSN";
            string cmdText="Insert into AccessTable (ColumnA,ColumnB,ColumnC,ColumnD,ColumnE,ColumnF,ColumnG,ColumnH) Values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8)";
            using (OdbcConnection cn = new OdbcConnection(strDSN))
            {
                using (OdbcCommand cmd = new OdbcCommand(cmdText, cn))
                {
                    cn.Open();
                    foreach (DataRow r in dt.Rows)
                    {
                        cmd.Parameters.AddWithValue("@p1", r["ColumnA"].ToString());
                        cmd.Parameters.AddWithValue("@p2", r["ColumnB"].ToString());
                        cmd.Parameters.AddWithValue("@p3", r["ColumnC"].ToString());
                        cmd.Parameters.AddWithValue("@p4", r["ColumnD"].ToString());
                        cmd.Parameters.AddWithValue("@p5", r["ColumnE"].ToString());
                        cmd.Parameters.AddWithValue("@p6", r["ColumnF"].ToString());
                        cmd.Parameters.AddWithValue("@p7", r["ColumnG"].ToString());
                        cmd.Parameters.AddWithValue("@p8", r["ColumnH"].ToString());
                        cmd.ExecuteNonQuery();//Exception at this line
                    }
                }
            }

要插入的DataTable有 8 列,我创建的Access表中也有 8 列。当我执行上述代码时,我遇到了异常。它说:

ERROR [07002ױ] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 8.

我提供了 8 个参数,但它抛出了错误。

谁能让我知道我做错了什么?

插入数据表以使用 c# 访问数据库

当前代码至少存在两个问题:

[1] 将System.Data.Odbc与 Access ODBC 驱动程序一起使用的参数化查询必须对所有参数占位符使用问号 (?)。它不认识@p1 @p2,...作为命令文本中的参数,因此您会收到"参数太少"错误。您需要使用

string cmdText="Insert into AccessTable (ColumnA,ColumnB,ColumnC,ColumnD,ColumnE,ColumnF,ColumnG,ColumnH)"
        + " Values (?,?,?,?,?,?,?,?)";

[2] 如果要在循环中使用Parameters.AddWithValue(),则需要在添加参数值之前执行Parameters.Clear()。(如果没有它,您将不断添加新的参数值 - 一次 8 个 - 而不是替换现有参数值。

foreach (DataRow r in dt.Rows)
{
    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("?", r["ColumnA"].ToString());
    cmd.Parameters.AddWithValue("?", r["ColumnB"].ToString());
    // and so on