我使用的是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);
答案 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查询中是正确的方法。
由于SqlConnection
,SqlCommand
和SqlDataAdapter
都是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);
}