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

クエリを実行して結果を確認する必要があります。ここでは、文字列をクエリ SQL と比較しているだけです。

こちらをご覧ください

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

チュートリアル用。

于 2012-10-24T15:50:48.150 に答える
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 に答える
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

実際にはどこでもコマンドを実行しません。コメントアウトされた の代わりに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 に答える