查询的麻烦,执行非标量不像我想象的那样
本文关键字:标量 麻烦 执行 查询 | 更新日期: 2023-09-27 18:12:56
我遇到了一个SQL查询问题:
using (SqlConnection conn = new SqlConnection("user id=user;" + "password=pass;" + "server=server;" + "database=db;"))
{
using (SqlCommand comm = new SqlCommand(@"SELECT COUNT(*) FROM [CompaniesDB].[dbo].[Companies] WHERE BolagsID = '" + BolagsID + "'"))
{
conn.Open();
comm.Connection = conn;
MessageBox.Show("TEST: {0}", Convert.ToString((int)comm.ExecuteScalar()));
}
}
我期望在消息框中获得一个int,表示BolagsID
出现的行数。但每次都是0。我尝试了SQL Server管理工作室的查询,它在那里工作得很好。我做错了什么?
这个工作,但现在我不知道如何参数化值:
string query = @"SELECT COUNT(*) FROM [CompaniesDB].[dbo].[Companies] WHERE BolagsID = " + BolagsID;
ADODB.Connection conn2 = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();
string strConn = "Provider=...;Data Source=...;Database=...;User Id=...;Password=...";
conn2.Open(strConn);
rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic;
rs.Open(query, conn2);
if (rs.Fields[0].Value > 0)
...stuff...
就像其他人说的,参数是个好主意。这里有一些东西可以让你开始:
string query = @"SELECT Count(*) FROM [CompaniesDB].[dbo].[Companies] WHERE BolagsID = @BolagsID";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@BolagsID", SqlDbType.NVarChar).Value = BolagsID;
conn.Open();
MessageBox.Show("TEST: {0}", Convert.ToString((int)cmd.ExecuteScalar()));
conn.Close();
}
基本上,如果查询中有错误,则返回0,因此即使SSMS足够智能来解决它,sql命令也不能。
一个快速的方法来确保一切都是正常工作的是改变查询只是"SELECT Count(*) FROM [companyesdb].[dbo].[Companies]"。如果这不起作用,那么问题可能在于您的数据库连接(权限?)或其他东西。
尝试分配SELECT COUNT(*) FROM [companyesdb].[dbo]。[Companies] WHERE BolagsID = '" + BolagsID + "'"到字符串str,如下所示
string str =@"SELECT COUNT(*) FROM [CompaniesDB].[dbo].[Companies] WHERE BolagsID = '" + BolagsID + "'";
using (SqlConnection conn = new SqlConnection("user id=user;" + "password=pass;" + "server=server;" + "database=db;"))
{
using (SqlCommand comm = new SqlCommand(str))
{
conn.Open();
comm.Connection = conn;
MessageBox.Show("TEST: {0}", Convert.ToString((int)comm.ExecuteScalar()));
}
}
然后在str的值上做一个手表/quickwatch,以获得正在运行的确切查询,然后在Sql management studio中运行相同的查询。如果在Sql Management Studio中也得到0,那么问题是数据不存在。
在尝试完全不同的方法之前,我尝试了很多东西。这给了我想要的结果:
string query = @"SELECT COUNT(*) FROM [CompaniesDB].[dbo].[Companies] WHERE BolagsID = " + BolagsID;
ADODB.Connection conn2 = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();
string strConn = "Provider=...;Data Source=...;Database=...;User Id=...;Password=...";
conn2.Open(strConn);
rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic;
rs.Open(query, conn2);
if (rs.Fields[0].Value > 0)
...stuff...
注意,连接和记录集在此代码段之外都是关闭的。