【问题标题】:c# Must declare the scalar variable "@Kundenname"c# 必须声明标量变量“@Kundenname”
【发布时间】:2016-04-27 11:44:34
【问题描述】:

我正在尝试为我们的小公司制作一个可以工作的小工具。

这应该将 DataGridView 中的数据填充到 SQL Server Standard 数据库中。 读取 SQL 表工作正常,但我无法获得写入值的工具。

我得到了标题中提到的错误。

代码如下:

var kdNummer = new SqlParameter("Kundennummer", SqlDbType.Int);
var kdName = new SqlParameter("Kundenname", SqlDbType.VarChar);
var kdMail = new SqlParameter("Kundenmail", SqlDbType.VarChar);
var kdTele = new SqlParameter("Telefon", SqlDbType.VarChar);

string kdquery = "INSERT INTO Kunden VALUES (@Kundennummer, @Kundenname, @Kundenmail, @Telefon)";

using (SqlConnection updatedb = new SqlConnection("Data Source=;Initial Catalog=updatedb;User ID=;Password="))
{
    updatedb.Open();

    for (int i = 0;i<dataGridView1.Rows.Count;i++)
    {
        using(SqlCommand NrDaten = new SqlCommand(kdquery, updatedb))
        {
            kdNummer.Value = dataGridView1.Rows[i].Cells["Kundennummer"].Value;                     
            NrDaten.Parameters.Add(kdNummer);

            NrDaten.ExecuteNonQuery();
        }

        using (SqlCommand NameDaten = new SqlCommand(kdquery, updatedb))
        {
            kdName.Value = dataGridView1.Rows[i].Cells["Kundenname"].Value;
            NameDaten.Parameters.Add(kdName);

            NameDaten.ExecuteNonQuery();
        }

        using (SqlCommand MailDaten = new SqlCommand(kdquery, updatedb))
        {
            kdMail.Value = dataGridView1.Rows[i].Cells["Kundenmail"].Value;
            MailDaten.Parameters.Add(kdMail);

            MailDaten.ExecuteNonQuery();
        }

        using (SqlCommand TeleDaten = new SqlCommand(kdquery, updatedb))
        {
            kdTele.Value = dataGridView1.Rows[i].Cells["Telefon"].Value;
            TeleDaten.Parameters.Add(kdTele);

            TeleDaten.ExecuteNonQuery();
        }
    }

    updatedb.Close();
}

【问题讨论】:

    标签: c# sql-server datagridview


    【解决方案1】:

    您的查询需要 4 个参数,但您始终只设置一个(另请注意,在 SqlParameter 中您还需要有 @ 符号)。因此,您会收到有关缺少参数的错误。您的代码应该如下所示:

    var kdNummer = new SqlParameter("@Kundennummer", SqlDbType.Int);
    var kdName = new SqlParameter("@Kundenname", SqlDbType.VarChar);
    var kdMail = new SqlParameter("@Kundenmail", SqlDbType.VarChar);
    var kdTele = new SqlParameter("@Telefon", SqlDbType.VarChar);
    
    string kdquery = "INSERT INTO Kunden VALUES (@Kundennummer, @Kundenname, @Kundenmail, @Telefon)";
    using (SqlConnection updatedb = new SqlConnection("..."))
    {
        updatedb.Open();
    
        using (SqlCommand insert = new SqlCommand(kdquery, updatedb))
        {
           insert.Parameters.Add(kdName);
           insert.Parameters.Add(kdNummer);
           insert.Parameters.Add(kdMail);
           insert.Parameters.Add(kdTele);
    
           for (int i = 0;i<dataGridView1.Rows.Count;i++)
           {
               kdName.Value = dataGridView1.Rows[i].Cells["Kundenname"].Value;
               kdNummer.Value = dataGridView1.Rows[i].Cells["Kundennummer"].Value;                     
               kdMail.Value = dataGridView1.Rows[i].Cells["Kundenmail"].Value;
               kdTele.Value = dataGridView1.Rows[i].Cells["Telefon"].Value;
    
               insert.ExecuteNonQuery();
           }
        }
    }
    

    甚至更短:

    string kdquery = "INSERT INTO Kunden VALUES (@Kundennummer, @Kundenname, @Kundenmail, @Telefon)";
    using (SqlConnection updatedb = new SqlConnection("..."))
    {
        updatedb.Open();
    
        for (int i = 0;i<dataGridView1.Rows.Count;i++)
        {
           using (SqlCommand insert = new SqlCommand(kdquery, updatedb))
           {
               insert.Parameters.AddWithValue("@Kundenname", dataGridView1.Rows[i].Cells["Kundenname"].Value); 
               insert.Parameters.AddWithValue("@Kundennummer", dataGridView1.Rows[i].Cells["Kundennummer"].Value); 
               insert.Parameters.AddWithValue("@Kundenmail", dataGridView1.Rows[i].Cells["Kundenmail"].Value);
               insert.Parameters.AddWithValue("@Telefon", dataGridView1.Rows[i].Cells["Telefon"].Value);
    
               insert.ExecuteNonQuery();
           }
        }
    }
    

    编辑:我修改了代码的长版本以最大限度地重复使用实例。否则,您会收到评论中提到的错误。

    【讨论】:

    • 我试图在代码看起来像现在这样之前将所有这些打包到一个语句中。但是我收到一个错误,它说 SqlParameter 已经在另一个 ParameterCollection 中。我也用你的代码试过了,但现在又说,参数已经在另一个 ParameterCollection 中:(
    • @jasonX2000 您是否也尝试过我的回答中的简短版本?我也将更新长解决方案。
    • @Torsten Dittmar 这似乎可行,只需将 AddWidthValue 更改为 AddWithValue。 :) 它在另一个错误中运行,上面写着:附加信息:字符串或二进制数据将被截断。该语句已终止。但是当我完成这个错误时,我可以说更多。
    • @JasonX2000 打算解决这个问题。这是一个复制和粘贴错字:-) 另一个错误意味着您尝试添加到表中的值比表中的字段长。缩短文本或增加字段长度。
    • 谢谢,没错。 Kundenname 太短了。该代码适用于:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多