c# - 未知错误 : insufficient parameters supplied to the command

标签 c# sqlite

在 C# 项目中,我在表单中制作了一个 datagridview,其中有一些 columns.column[0]& column[1] 名称是固定的(日期和日期),其他列名称是可变的,将由用户更改。这些列具有显示开始和结束时间的时间段。 例如,从早上 6 点到下午 14 点,列名称显示为 6_14。我们有一个列表框,其项目数量可变(计数器“i”)。

///sqlite doesn't accept columns name that start and finish with Numbers.I added word "f" to start and end of each
///column name

string data_str = "";
string data_str2="";

for (int i = 0; i < listBox1.Items.Count;i++ )
{
    string temp = "f"+ listBox1.Items[i].ToString()+"f";
    data_str = data_str + temp +",";

    string temp2 =  "@"+listBox1.Items[i].ToString()+",";
    data_str2=data_str2+temp2;
}

data_str=data_str.TrimEnd(',');
data_str2=data_str2.TrimEnd(',');

第一步,我在数据库的数据表中创建了两列“day”和“date”,并成功将数据导入其中。(有效)

string Q_insert = "insert into " + table_name + " (day,date) values (@day,@date)";
SQLiteConnection connect = new SQLiteConnection(connection_string);
SQLiteCommand insert_cmd = new SQLiteCommand(Q_insert, connect);
foreach (DataGridViewRow row in shift_datagrid.Rows)
{

    insert_cmd.Parameters.AddWithValue("@day", row.Cells[0].Value.ToString().Trim());
    insert_cmd.Parameters.AddWithValue("@date", row.Cells[1].Value.ToString().Trim());

    connect.Open();
    insert_cmd.ExecuteNonQuery();
    connect.Close();
}

第二步,我需要将用户数据从datagridview导入到数据表中,但发生错误。(它不起作用)

int col_cnt = listBox1.Items.Count;

Q_insert = "insert into " + table_name + " (" + data_str + ") values (" + data_str2 + ")";
connect = new SQLiteConnection(connection_string);
insert_cmd = new SQLiteCommand(Q_insert, connect);

foreach (DataGridViewRow row in shift_datagrid.Rows)
{

    string temp1 = "";
    for (int i = 0; i < col_cnt; i++)
    {           
        temp1 = "\"@" + listBox1.Items[i].ToString() +"\"";
        insert_cmd.Parameters.AddWithValue(temp1, row.Cells[i + 2].Value.ToString().Trim()); 
    }

    connect.Open();
    insert_cmd.ExecuteNonQuery();
    connect.Close();       
}

不幸的是,出现了这个错误: 未知错误:为命令提供的参数不足 我用谷歌搜索了这个错误并检查了相同问题的解决方案,但它们对我的问题没有用,而且无论如何也无法帮助我。

这是将数据插入数据库的输出命令字符串的示例(两个步骤):
1.插入[table_name](日期,日期)值(@day,@date)-------------->(有效)
2. 插入 [table_name] (f6_14f,f14_22f,f22_6f) 值 (@6_14,@14_22,@22_6) ------->(不起作用)

请帮帮我 谢谢

最佳答案

以下可能导致错误:

temp1 = "\"@" + listBox1.Items[i].ToString() +"\"";
insert_cmd.Parameters.AddWithValue(temp1, row.Cells[i + 2].Value.ToString().Trim());

语法要求您不要将 @ 构造为变量值的一部分。@ 不是数据。像以前一样将其用作变量名称的一部分:

insert_cmd.Parameters.AddWithValue("@Col1",listBox1.Items[i+2].Value.ToString().Trim());

其中 @Col1 是表的列名称。

我认为您不能在 for 循环中构建参数名称,如果是这样,您必须列出插入语句,每个列名称参数都以 @ 为前缀,如上面的示例/代码所示。

关于c# - 未知错误 : insufficient parameters supplied to the command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027324/

相关文章:

SQL 如何从列表中查找不在表中的值

java - 如何在 ListView 中传递所选行的 id 并在另一个 Activity 中获取行的值,值存储在 sqlite 数据库中

android - 在 Android 中将值插入 SQLite 表

java - 无法弄清楚为什么这个大的双内部连接不起作用,但是当拆分时它会起作用

java - 在 Android 的 SQlite 数据库中存储 Null

c# - 使用动态关键字从 C# 运行 IronPython 对象

c# - 你能在 TestCleanup 中悄悄地重新运行测试吗

c# - 是否可以使用 ResourceManager 获取资源的评论?

C# 随机坐标是线性的

c# - 为什么锁对象必须是只读的?