参数附近的语法不正确

时间:2017-11-19 21:13:28

标签: c# sql-server

我使用的是Visual Studio 2013,C#和SQL Server数据库。

如果我用一个具体值替换参数,T-SQL命令就可以正常工作。

我在最后一行代码中收到此错误:

  

@ Collection1'附近的语法不正确。

我的代码:

string myCommandString = "select Name, Collection, Text from List_Card @Collection1";
SqlConnection myConnection = new SqlConnection(connectionstring);

SqlCommand myCommand = new SqlCommand(myCommandString, myConnection);
SqlDataAdapter myydata = new SqlDataAdapter();

if (comboBox1.Text != "")
{
    string1 = "where Collection IN (select Shortcut from Collections where Collection Like '" + comboBox1.Text + "')";
}
else 
{
    string1 = ""; 
}

myCommand.Parameters.Add(new SqlParameter("@Collection1", string1));
myydata.SelectCommand = myCommand;

myConnection.Open();
DataTable myytab = new DataTable();
myydata.Fill(myytab);

3 个答案:

答案 0 :(得分:3)

您的代码中存在多个错误。

首先,你的myCommandString:

"select Name, Collection, Text from List_Card @Collection1"

这是无效的SQL语法(你得到的错误是什么)。你没有对参数做任何事情。您需要将其作为WHERE子句的一部分,但您并未使用该值。

接下来,您完全错误地使用了SqlParameter。查看the documentation以了解如何正确使用它。具体问题是您没有将条件SQL字符串指定为第二个参数。您需要有条件地将其附加到您的查询中。

最后,您还应该在using语句中包装所有内容以正确处理对象。

这可以为您提供您正在寻找的内容:

var myCommandString = "select Name, Collection, Text from List_Card ";

if (comboBox1.Text != "")
{
    myCommandString += " where Collection IN (select Shortcut from Collections where Collection Like '@Collection1')";
}

using (var myConnection = new SqlConnection(connectionstring))
using (var myCommand = new SqlCommand(myCommandString, myConnection))
{
    myCommand.Parameters.Add(new SqlParameter("@Collection1", string1));

    using (var myData = new SqlDataAdapter()) 
    {
        myData.SelectCommand = myCommand;
        myConnection.Open();

        var myytab = new DataTable();
        myydata.Fill(myytab);
    }
}

答案 1 :(得分:1)

参数不是那样的。我猜你想要有相同的查询,然后如果用户选择了某些内容,则动态添加where子句。不幸的是,你不能以整个where子句是参数的方式来做。你可以尝试这样的事情:

string myCommandString = @"select Name, Collection, Text from 
List_Card where Collection IN 
    (select Shortcut from Collections where Collection Like '%' + @collection + '%')";
SqlConnection myConnection = new SqlConnection(connectionstring);
SqlCommand myCommand = new SqlCommand(myCommandString, myConnection);
SqlDataAdapter myydata = new SqlDataAdapter();
myCommand.Parameters.Add(new SqlParameter("@Collection1", comboBox1.Text));
myydata.SelectCommand = myCommand;
myConnection.Open();
DataTable myytab = new DataTable();
myydata.Fill(myytab);

答案 2 :(得分:0)

您不能通过参数指定整个WHERE子句。允许参数代替...... well,参数。如果要根据C#代码中的条件添加WHERE子句,请执行以下操作:

string myCommandString = "SELECT Name, Collection, Text FROM List_Card";
.
.
.

if (comboBox1.Text != "")
{
    myCommandString += " WHERE Collection IN (SELECT Shortcut FROM Collections WHERE Collection Like '" + comboBox1.Text + "')";
}

此外,对象的dispose使用后非常重要。执行此操作的最快方法是在using语句中使用代码。最后,您应该尽力阻止SQL injection attacks。您已经使用了这个 - 在ADO.NET的情况下,将Parameter添加到动态SQL查询中是正确的方法。

由于SqlConnectionSqlCommandSqlDataAdapter都是IDisposable对象,因此您的代码应如下所示:

string myCommandString = "SELECT Name, Collection, Text FROM List_Card";

using (var  myConnection = new SqlConnection(connectionstring))
using (var  myCommand = new SqlCommand(myCommandString, myConnection))
using (var  myydata = new SqlDataAdapter())
{
    if (comboBox1.Text != "")
    {
        myCommandString += " WHERE Collection IN (SELECT Shortcut FROM Collections WHERE Collection Like @Collection1)";
        myCommand.Parameters.Add(new SqlParameter("@Collection1", comboBox1.Text));
    }

    myydata.SelectCommand = myCommand;
    myConnection.Open();
    DataTable myytab = new DataTable();
    myydata.Fill(myytab);
}