0

我需要从数据库中的字段中检索一个值。我有使用以下代码。但值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 = "数据源 = EAEDEV;初始目录 = GIS;集成安全 = 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();


                    }
4

6 回答 6

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 行)中的值作为可以转换为更好类型的对象(取决于它在结果集架构中的类型)。

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

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

于 2012-10-24T15:51:58.977 回答
2

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

请看这里

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

教程。

于 2012-10-24T15:50:48.150 回答
1

您可以在查询中添加空间

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

注意:我建议你使用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

于 2012-10-24T15:49:32.277 回答
0

你实际上并没有在任何地方运行你的命令。而不是 commented-out cmd.ExecuteNonQuery,您应该查看该ExecuteScalar方法,它允许您从查询中读回单个结果值 - 这就是您的查询返回的内容。

于 2012-10-24T15:52:40.770 回答
0

添加

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

紧接着

SqlCommand cmd = new SqlCommand(checkOrderId, connection);

那么变量i将包含订单ID

于 2012-10-24T15:53:38.650 回答
0

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

于 2012-10-24T15:56:25.233 回答