查询麻烦,执行非标量不符合我的想法

时间:2013-05-10 13:01:32

标签: c# sql sql-server

我遇到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 Management Studio中尝试了这个查询,它在那里工作得很好。我做错了什么/错过了什么?

编辑:

这样可行,但现在我不知道如何参数化值:

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...

3 个答案:

答案 0 :(得分:2)

像其他人说的那样,参数是一个好主意。这是让你入门的东西:

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 [CompaniesDB]。[dbo]。[公司]”。如果这不起作用,则问题可能在于您的数据库连接(权限?)或其他。

答案 1 :(得分:0)

尝试分配SELECT COUNT(*)FROM [CompaniesDB]。[dbo]。[公司] 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的值上执行watch / quickwatch以获取正在运行的确切查询,然后在Sql Managment studio中运行相同的查询。如果你在Sql Management Studio中得到0,那么问题是数据不存在。

答案 2 :(得分: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...

请注意,连接和记录集都在此代码段之外关闭。