我知道这个问题曾多次被问过,但没有一个答案能帮助我解决这个问题。
所以,我正在编写数据传输实用程序,将数据从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);
}
这是错误的屏幕截图。
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;
}
至
// 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
的列名列表,则将为所有列指定值。