【问题标题】:SQL insert error on C#.NetC#.Net 上的 SQL 插入错误
【发布时间】:2016-05-24 18:11:12
【问题描述】:

我想在 SQL server 2014 上的表中插入设备名称和相关序列号的字符串列表。IDE 是 Visual Studio 2015,编程语言是 C#。

当我运行程序并单击button14时,错误是:

参数化查询 '(@ID int,@NAME nvarchar(4000),@RSSI int)INSERT BeaconInfo (ID, N' 需要参数 '@NAME',但未提供。

我不确定我插入 sql 的代码是否正确。

public partial class Form1 : Form
{
    int seqnumber = 333;
    List<string> items;
    string tmp_name;
    BluetoothDeviceInfo[] devices;

    public Form1()
    {
       items = new List<string>();
       InitializeComponent();
    }

private void startScan()
{
    listBox1.DataSource = null;
    listBox1.Items.Clear();
    items.Clear();
    Thread bluetoothScanThread = new Thread(new ThreadStart(scan));
    bluetoothScanThread.Start();
}

private void scan()
{
    updateUI("Starting Scan..");
    BluetoothClient client = new BluetoothClient();
    devices = client.DiscoverDevicesInRange();
    updateUI("Scan complete");
    updateUI(devices.Length.ToString() + " devices discovered");

    foreach (BluetoothDeviceInfo d in devices)
    {
      items.Add(d.DeviceName);
    }
    updateDeviceList();
}


private void button14_Click(object sender, EventArgs e)
{
    System.Data.SqlClient.SqlConnection sqlConnection1 = new System.Data.SqlClient.SqlConnection("....");
    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.CommandText = "INSERT BeaconInfo (ID, Name, RSSI) VALUES (@ID, @NAME, @RSSI)";
    cmd.Parameters.AddWithValue("@ID", seqnumber);
    cmd.Parameters.AddWithValue("@NAME", tmp_name);
    cmd.Parameters.AddWithValue("@RSSI", 55);
    cmd.Connection = sqlConnection1;

    for (int j = 0; j < items.Count; j++)
    {
      seqnumber = seqnumber + 1;
      tmp_name = items[j];
      sqlConnection1.Open();
      cmd.ExecuteNonQuery();
      sqlConnection1.Close();
    }
}

【问题讨论】:

  • tmp_name 为空。 Look at this question
  • 请注意,在循环中更改tmp_name 的值不会更改@NAME 参数的值。

标签: c# sql


【解决方案1】:

请尝试像这样更改您的代码:

private void button14_Click(object sender, EventArgs e)
{
    using (System.Data.SqlClient.SqlConnection sqlConnection1 = new System.Data.SqlClient.SqlConnection("....")) 
    {

       sqlConnection1.Open();

       for (int j = 0; j < items.Count; j++)
       {
           seqnumber = seqnumber + 1;
           tmp_name = items[j];



           using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand()) 
           {
              cmd.CommandType = System.Data.CommandType.Text;
              cmd.CommandText = "INSERT BeaconInfo (ID, Name, RSSI) VALUES (@ID, @NAME, @RSSI)";
              cmd.Parameters.AddWithValue("@ID", seqnumber);
              cmd.Parameters.AddWithValue("@NAME", tmp_name);
              cmd.Parameters.AddWithValue("@RSSI", 55);
              cmd.Connection = sqlConnection1;


              try 
              {
                   cmd.ExecuteNonQuery();
              } 
              catch (Exception ex) 
              {
                   //Here handle if error
              }

           }
        }
    }
}

一般来说,在处理程序中编写 sql 语句并不是一个好习惯,所以在 Form qctually 中。最好创建执行此操作的类,并在处理程序中调用它。

请注意,根据您的问题建议,tmp_name 未设置,SqlClient 中的参数未引用,因此在关联到变量 tmp_name 后更改值对参数值没有任何影响。

【讨论】:

  • sqlConnection1.Close(); 如果您将 sqlConnect1 对象包裹在 using 周围,您将不需要 .Close() 方法调用。我也不认为 Insert 总是可以工作或执行,所以我也会将 cmd.ExecuteNonQuery() 调用包装在 try catch 周围..
  • 其实你可以有多个嵌套 using(){} 也许你不熟悉怎么做..我一直在使用多个 using..所以我没有错
  • 我之前误读了您的评论 :) 所以我删除了我不正确的评论。无论如何,我会听取建议并将其添加到答案中。
  • 没问题,如果 OP 在类的标题部分有 using System.Data.SqlClient,也没有理由完全限定 using 语句正文中的名称空间 :)
  • 是的,但我认为当这段代码至少看起来像问题时,更容易知道是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多