必须声明一个标量变量(C#和OleDb)

问题描述 投票:1回答:1

我知道这个问题曾多次被问过,但没有一个答案能帮助我解决这个问题。

所以,我正在编写数据传输实用程序,将数据从OleDb数据库的一个表复制到另一个OleDb数据库的表。

我已经读取了源数据库中的所有数据,并且我正在尝试编写,但总是会收到此错误

必须声明标量变量“@CategoryID”

这是代码

 // generating the insert string below
 string insert = "INSERT INTO Categories VALUES (";
 for(int i = 0; i < cols.Length; i++)
 {
     string coma = ", ";
     if (i == cols.Length - 1)
     coma = " )";

     insert += "@" + cols[i] + coma;
 }

try
{ 
    while (src_reader.Read())         // reading from source database
    {
        dstcmd.CommandText = insert;   

        for (int i = 0; i < cols.Length; i++)
        {
            string temp = "@" + cols[i];     // cols is array of column names
            dstcmd.Parameters.AddWithValue(temp, src_reader[cols[i]]);

            // for debug purposes... below is screenshot of error
            Console.Write(temp + "  " + src_reader[cols[i]] + "\n");
        }

        Console.WriteLine("");

        // point of error
        dstcmd.ExecuteNonQuery();
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex);
}

这是错误的屏幕截图。

Error image

CategoryID是表的第一列,因此是插入的第一个值。

任何帮助将不胜感激。如果我错过任何信息或某些事情没有意义,请告诉我。

c# sql sql-server ado.net oledb
1个回答
2
投票

尝试更改此部分:

// generating the insert string below
 string insert = "INSERT INTO Categories VALUES (";
 for(int i = 0; i < cols.Length; i++)
 {
     string coma = ", ";
     if (i == cols.Length - 1)
     coma = " )";

     insert += "@" + cols[i] + coma;
 }

// generating the insert string below
 string insert = "INSERT INTO Categories VALUES (";
 for(int i = 0; i < cols.Length; i++)
 {
     string coma = ", ";
     if (i == cols.Length - 1)
     coma = " )";

     insert += "?" + coma;
 }

您不需要在VALUES中使用参数名称,只需使用?占位符。但是,请确保添加参数时的参数顺序与表中列的顺序相匹配。

此外,最好在INSERT子句中显式指定列列表,如:

string insert = "INSERT INTO Categories (Col1, Col2, Col3, etc.)  VALUES (";

看看是否要动态生成列名列表。但我建议首先让它为静态列列表工作,然后将其转换为动态版本。

此外,如果未指定INSERT的列名列表,则将为所有列指定值。

© www.soinside.com 2019 - 2024. All rights reserved.