2

我在使用 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...
4

3 回答 3

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].[Companies]”。如果这不起作用,那么问题可能出在您的数据库连接(权限?)或其他问题上。

于 2013-05-10T13:10:44.847 回答
0

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

于 2013-05-10T13:18:04.813 回答
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...

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

于 2013-05-14T05:46:12.303 回答