此查询是否正确检索数据库中的数据?

时间:2012-10-24 15:47:41

标签: c# sql

我需要从数据库中的字段中检索值。我有以下代码。但值checkOrderId(我需要)显示SQL字符串而不是数据库中的值。我不知道为什么会这样做。有人可以帮帮我吗?

 string connectionString = "Data Source = xxyyzz;Initial Catalog = xyz; Integrated Security = True";

SqlConnection connection = new SqlConnection(connectionString);

connection.Open();

string tableName = "[GIS].[SecondaryTraffic].[PotentialBackHauls]";

string checkOrderId = "Select TOP 1 OrderID From" + tableName + "ORDER BY InsertDate DESC";

SqlCommand cmd = new SqlCommand(checkOrderId, connection);

//cmd.ExecuteNonQuery();

OpenPop.Pop3.Pop3Client popConn = new OpenPop.Pop3.Pop3Client();
if (orderIdentity == checkOrderId)
{
      popConn.DeleteMessage(messageNumber);
}

connection.Close();

我是新人,没有立即回答我的问题的声誉。在每个人的帮助下,我解决了这个问题...很棒的帮助,感谢所有人......以下是我的代码。

string connectionString =“Data Source = EAEDEV; Initial Catalog = GIS; Integrated Security = True”;

                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {


                        connection.Open();

                        string tableName = "[GIS].[SecondaryTraffic].[PotentialBackHauls]";

                        string checkOrderId = "Select TOP 1 OrderID From " + tableName + " ORDER BY InsertDate DESC";

                        SqlCommand cmd = new SqlCommand(checkOrderId, connection);


                        string valueReturned = (string)cmd.ExecuteScalar();

                        OpenPop.Pop3.Pop3Client popConn = new OpenPop.Pop3.Pop3Client();

                        if (orderIdentity == valueReturned)
                        {
                            popConn.DeleteMessage(messageNumber);
                        }

                        connection.Close();


                    }

6 个答案:

答案 0 :(得分:2)

您需要执行查询并检查结果,这里只是将字符串与查询SQL进行比较。

请看这里

http://www.csharp-station.com/Tutorial/AdoDotNet/lesson03

获得教程。

答案 1 :(得分:2)

您对结果设置为checkOrderId的期望不正确。在这种情况下,checkOrderId只是要执行的查询而不是实际结果。

您需要从执行命令后读取值:

using (var connection = new SqlConnection(connectionString))
using (var comm = new SqlCommand("Select TOP 1 OrderID From [GIS].[SecondaryTraffic].[PotentialBackHauls] ORDER BY InsertDate DESC", connection))
{
    connection.Open();

    object result = comm.ExecuteScalar(); // This is the key bit you were missing.

    if (result != null)
    {
        // You can cast result to something useful
        int orderId = (int)result;
    }
} // Both comm and connection will have Dispose called on them here, no need to Close manually.

ExecuteScalar返回第一个单元格(即第1列第1行)中的值,作为可以转换为更好类型的对象(取决于它在结果集架构中的类型)。 / p>

如果您需要阅读多个值,则需要查看ExecuteReader

使用输出参数还有其他方法可以做到这一点,但这会污染答案。

答案 2 :(得分:1)

您可以为查询添加空间

"Select TOP 1 OrderID From " + tableName + " ORDER BY InsertDate DESC";

Nota:我建议您将AddWithValue method与参数

一起使用
string checkOrderId = "Select TOP 1 OrderID From @tableName ORDER BY InsertDate DESC";
SqlCommand cmd = new SqlCommand(checkOrderId, connection);
cmd.Parameters.AddWithValue("@tableName", tableName );

链接:http://msdn.microsoft.com/fr-fr/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

答案 3 :(得分:0)

您实际上并未在任何地方运行命令。您应该查看ExecuteScalar方法,而不是注释掉的cmd.ExecuteNonQuery,它允许您从查询中读回单个结果值 - 这是您的查询返回的结果。

答案 4 :(得分:0)

添加

int i = (Int32) cmd.ExecuteScalar();

之后

SqlCommand cmd = new SqlCommand(checkOrderId, connection);

然后变量i将包含订单ID

答案 5 :(得分:0)

不,这不正确。您正在将变量orderId与查询字符串进行比较。我怀疑那是你想要做的。我想你最好调用cmd.ExecuteScalar()来检索实际的OrderID值。如其他答案所述,您的查询字符串缺少空格。但最重要的是,在代码中构造SQL查询是不好的做法。虽然我看不到此代码的安全性问题,但如果继续使用此方法,您可能会编写易受SQL注入攻击的代码。我建议您学习使用参数或LINQ来构建查询。