【问题标题】:c# SQL Error - Must declare scalarc# SQL 错误 - 必须声明标量
【发布时间】:2015-06-30 12:59:22
【问题描述】:

我已经声明了标量,但我仍然收到错误。我的代码检查条目是否存在,如果存在则更新条目,或者如果不存在则创建一个新条目:

        try
        {
            string server = Properties.Settings.Default.SQLServer;
            string connection = "Data Source=" + server + ";Initial Catalog=Propsys;Persist Security Info=True;User ID=sa;Password=0925greg";
            using (SqlConnection cn = new SqlConnection(connection))
            {
                cn.Open();
                    SqlCommand cmdCount = new SqlCommand("SELECT count(*) from Agent WHERE ContactPerson = @" + this.contactPersonTextBox.Text, cn);
                    cmdCount.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);
                    SqlDataReader myReader;
                    myReader = cmdCount.ExecuteReader();
                    int count = 0;
                    while (myReader.Read())
                    {
                        count = count + 1;
                    }
                    if (count > 0)
                    {
                        string query = "UPDATE _1Agent SET DealID = @DealID, \n" +
                                        "ContactPerson = @ContactPerson, \n" +
                                        "Address = @Address, \n" +
                                        "TaxVatNo = @TaxVatNo, \n" +
                                        "Comm = @Comm, \n" +
                                        "WorkTel = @WorkTel, \n" +
                                        "Cell = @Cell, \n" +
                                        "Fax = @Fax, \n" +
                                        "Email = @Email, \n" +
                                        "Web = @Web, \n" +
                                        "CreateDate = @CreateDate, \n" +
                                        "Notes = @Notes WHERE id = @id";
                        SqlCommand cm = new SqlCommand(query);
                        string Contact = contactPersonTextBox.Text;
                        cm.Parameters.AddWithValue("@DealID", txtDealNo.Text);
                        cm.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);
                        cm.Parameters.AddWithValue("@Address", addressTextBox.Text);
                        cm.Parameters.AddWithValue("@TaxVatNo", taxVatNoTextBox.Text);
                        cm.Parameters.AddWithValue("@Comm", commTextBox.Text);
                        cm.Parameters.AddWithValue("@WorkTel", workTelTextBox.Text);
                        cm.Parameters.AddWithValue("@Cell", cellTextBox.Text);
                        cm.Parameters.AddWithValue("@Fax", faxTextBox.Text);
                        cm.Parameters.AddWithValue("@Email", emailTextBox.Text);
                        cm.Parameters.AddWithValue("@CreateDate", DateTime.Now);
                        cm.Parameters.AddWithValue("@Notes", notesTextBox.Text);
                        cm.CommandText = query;
                        cm.ExecuteNonQuery();
                        cn.Close();
                        MessageBox.Show("Saved...", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                    else
                    {
                        string query1 = "INSERT INTO _1Agent (DealID, \n" +
                                        "ContactPerson, \n" +
                                        "Address, \n" +
                                        "TaxVatNo, \n" +
                                        "Comm, \n" +
                                        "WorkTel, \n" +
                                        "Cell, \n" +
                                        "Fax, \n" +
                                        "Email, \n" +
                                        "CreateDate, \n" +
                                        "Notes) VALUES ('" + txtDealNo.Text + "',\n" +
                                        "'" + contactPersonTextBox.Text + "',\n" +
                                        "'" + addressTextBox.Text + "',\n" +
                                        "'" + taxVatNoTextBox.Text + "',\n" +
                                        "'" + commTextBox.Text + "',\n" +
                                        "'" + workTelTextBox.Text + "',\n" +
                                        "'" + cellTextBox.Text + "',\n" +
                                        "'" + faxTextBox.Text + "',\n" +
                                        "'" + emailTextBox.Text + "',\n" +
                                        "'" + notesTextBox.Text + "',\n" +
                                        "'" + DateTime.Now + "')";
                        SqlCommand cm = new SqlCommand(query1);
                        string Contact = contactPersonTextBox.Text;
                        cm.Parameters.AddWithValue("@DealID", txtDealNo.Text);
                        cm.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);
                        cm.Parameters.AddWithValue("@Address", addressTextBox.Text);
                        cm.Parameters.AddWithValue("@TaxVatNo", taxVatNoTextBox.Text);
                        cm.Parameters.AddWithValue("@Comm", commTextBox.Text);
                        cm.Parameters.AddWithValue("@WorkTel", workTelTextBox.Text);
                        cm.Parameters.AddWithValue("@Cell", cellTextBox.Text);
                        cm.Parameters.AddWithValue("@Fax", faxTextBox.Text);
                        cm.Parameters.AddWithValue("@Email", emailTextBox.Text);
                        cm.Parameters.AddWithValue("@CreateDate", DateTime.Now);
                        cm.Parameters.AddWithValue("@Notes", notesTextBox.Text);
                        cm.CommandText = query1;
                        cm.ExecuteNonQuery();
                        cn.Close();
                        MessageBox.Show("Saved...", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

【问题讨论】:

  • 究竟在哪一行? this.contactPersonTextBox.Text 的值是多少?
  • 此时代码失败:myReader = cmdCount.ExecuteReader();
  • 您应该使用ExecuteScalar 来读取您的count(*) 结果,无需循环阅读器;它总是返回一个值。如果您实际上并不关心计数值,请使用if exists

标签: c# sql declare scalar


【解决方案1】:

你的参数用法不对,应该是:

SqlCommand cmdCount = 
new SqlCommand("SELECT count(*) from Agent WHERE ContactPerson = @ContactPerson", cn);

稍后您将正确添加参数。

cmdCount.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);

要获得计数,请使用SqlCommand.ExecuteScalar,而不是使用DataReader

int count = (int) cmdCount.ExecuteScalar();

对于其他查询,UPDATEINSERT,您可以使用逐字字符串,而不是在多行上连接字符串。

string query = @"UPDATE _1Agent SET DealID = @DealID, 
                ContactPerson = @ContactPerson, 
                Address = @Address, 
                TaxVatNo = @TaxVatNo, 
                Comm = @Comm, 
                WorkTel = @WorkTel, 
                Cell = @Cell, 
                Fax = @Fax, 
                Email = @Email, 
                Web = @Web, 
                CreateDate = @CreateDate, 
                Notes = @Notes WHERE id = @id";

代码的其他问题:

  • 您正在连接字符串以形成INSERT 查询,稍后您将添加参数,遵循与UPDATE 查询相同的约定,然后使用参数。
  • 正如另一个答案中所指出的,您没有为UPDATE 命令添加参数@id
  • 您没有使用UPDATEINSERT 命令指定连接属性

像这样指定它

SqlCommand cm = new SqlCommand(query, cn);
  • 考虑将ConnectionCommand 对象包含在using 中 声明,因为它将确保正确处置非托管资源。

【讨论】:

    【解决方案2】:

    我看到了一些东西;

    不要使用带有@ 符号的字符串连接作为参数。那是错误的用法。像这样使用它;

    "SELECT count(*) from Agent WHERE ContactPerson = @ContactPerson"
    

    cmdCount.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);
    

    并使用ExecuteScalar 获取第一行的第一列。此命令不需要使用阅读器。

    您的 UPDATE 查询需要 @id 值,因为您在命令中将其声明为;

    cm.Parameters.AddWithValue("@id", yourIDvalue);
    

    你的INSERT 查询,你从不在你的命令中声明你的参数。您只需将它们与它们的值连接起来。并使用verbatim string literal 生成多行字符串,而不是使用\n

    详细了解参数化查询以及如何使用它们。

    【讨论】:

    • OP 中的“必须声明标量”可能有很多错误,向下滚动并查看 INSERT 语句 +1,
    • 好的,它与现有的入口位置配合得很好,然后决定更新或插入。但现在我收到此错误:ExecuteNonQuery: Connection property has not been initialized。我应该什么时候打开连接然后关闭?
    • @user2542289,那是因为使用INSERTUPDATE 命令,您没有指定连接SqlCommand cm = new SqlCommand(query);,只需执行SqlCommand cm = new SqlCommand(query, cn);
    【解决方案3】:

    您忘记在选择查询中提及参数名称

    SqlCommand cmdCount = new SqlCommand("SELECT count(*) from Agent WHERE ContactPerson = @ContactPerson", cn);
    cmdCount.Parameters.AddWithValue("@ContactPerson", contactPersonTextBox.Text);
    

    有一些错误的地方。所以你可以参考@Soner Gönül@habib的答案

    并更改您的插入查询。由于您已声明参数但未定义。因此更改如下

     string query1 = "INSERT INTO _1Agent (DealID,ContactPerson,Address,TaxVatNo, 
                         Comm, WorkTel, Cell, Fax, Email,Notes,CreateDate)
                         VALUES ( @DealID , @ContactPerson,@Address ,@TaxVatNo ,
                         @Comm,@WorkTel , @Cell,@Fax,@Email,@Notes,@CreateDate)";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多