【问题标题】:What does it mean "must declare scalar variable" error in C# form? [duplicate]C# 形式的“必须声明标量变量”错误是什么意思? [复制]
【发布时间】:2018-09-21 13:31:20
【问题描述】:

我尝试更新表单但出现错误:

必须声明标量变量“@isyeri”。

我的代码和 SQL Server 表代码如下。

 using (OleDbConnection con = new OleDbConnection("Provider=sqloledb;SERVER=NEVZAT-PC;DATABASE=DENEME;User ID=sa;password=sapass;"))
 using (OleDbCommand cmd = new OleDbCommand("update istakip set isyeri=@isyeri,isaciklama=@isaciklama,durum=@durum,personel=@personel,tarih=@tarih,baslamasaati=@baslamasaati,netsure=@netsure,kullanilanmalzeme=@kullanilanmalzeme,isbolum=@isbolum,arizatanim=@arizatanim,isemrino=@isemrino,kadi=@kadi where id=@id)", con))
 {
     cmd.Parameters.AddWithValue("@isyeri", comboBox1.Text);
     cmd.Parameters.AddWithValue("@isaciklama", textBox2.Text);
     cmd.Parameters.AddWithValue("@durum", comboBox2.Text);
     cmd.Parameters.AddWithValue("@personel", comboBox3.Text);
     cmd.Parameters.AddWithValue("@tarih", dateTimePicker1.Value);
     cmd.Parameters.AddWithValue("@baslamasaati", dateTimePicker2.Value.ToString());//veritabanında varchar türünde bu
     cmd.Parameters.AddWithValue("@netsure", textBox3.Text);
     cmd.Parameters.AddWithValue("@kullanilanmalzeme", textBox4.Text);
     cmd.Parameters.AddWithValue("@isbolum", comboBox4.Text);
     cmd.Parameters.AddWithValue("@arizatanim", comboBox5.Text);
     cmd.Parameters.AddWithValue("@isemrino", textBox5.Text);
     cmd.Parameters.AddWithValue("@kadi", label13.Text);
     cmd.Parameters.AddWithValue("@id", dataGridView1.CurrentRow.Cells[0].Value);

     con.Open();
     cmd.ExecuteNonQuery();
     con.Close();
}

和我的 SQL Server 表结构:

CREATE TABLE [dbo].[istakip]
(
    [id] [numeric](5, 0) IDENTITY(1,1) NOT NULL,
    [isyeri] [nvarchar](50) NULL,
    [isaciklama] [varchar](max) NULL,
    [durum] [nvarchar](50) NULL,
    [personel] [nvarchar](50) NULL,
    [tarih] [datetime] NULL,
    [baslamasaati] [nvarchar](50) NULL,
    [netsure] [nvarchar](50) NULL,
    [kullanilanmalzeme] [varchar](max) NULL,
    [isbolum] [nvarchar](100) NULL,
    [arizatanim] [nvarchar](100) NULL,
    [isemrino] [nvarchar](50) NULL,
    [kadi] [nvarchar](50) NULL
)

【问题讨论】:

  • 在公共网站上提供您的 sa 密码并不是最好的办法
  • iirc OleDbCommand 需要未命名的参数,因此请使用序号 ? 字符而不是 @names(或者如果您仅使用 MSSQL,请使用 System.Data.SqlClient)
  • @AlexK.: 但如果你使用@ 并且位置正确,它不应该也可以工作吗?
  • 我不这么认为,服务器看到 @isyeri 令牌并认为是一个未声明的变量,因为它没有在命令中被替换。
  • 位置正确。您可以检查

标签: c# .net sql-server ado.net


【解决方案1】:

一种可能性是您的某些参数值为空。参数使用空值时,必须设置为DBNull,否则参数将不会传递给SQL语句:

cmd.Parameters.AddWithValue("@isyeri", ((object) comboBox1.Text ?? DBNull.Value));

也就是说,我不认为ComboBoxText 属性可以为null,但是在处理SQL 参数时养成一个好习惯。

【讨论】:

  • 对不起,没用。说不能申请
  • @nevzataltıparmak - 您需要转换为对象,以便它们是相同的类型(请参阅答案更新)。这是您正在寻找的答案,我正在寻找一个副本,因为我知道我以前在 Stack Overflow 上看到过这个。
【解决方案2】:

参考以下链接:

MSDN Link for OleDBCommand

对于 OleDbCommand 的情况:

@ 更改为? 并使用相同的顺序添加参数。

正如@Igor 在评论中所说,这两个符号都可以使用。检查以下为 OleDb 添加的参数。此外,您似乎需要将单元格值转换为 @id 参数的整数。

cmd.Parameters.Add(
        "@isyeri", OleDbType.VarChar, 50).Value = comboBox1.Text;
//...

cmd.Parameters.Add(
        "@id", OleDbType.Integer).Value = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value);

【讨论】:

  • 尽管? 可以使用,@pname 也可以使用,尽管在这两种情况下顺序位置是唯一重要的事情。上述错误不是参数名称或位置引起的,因为参数集合中的位置与语句中的位置匹配。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2017-09-24
相关资源
最近更新 更多