1

これにはかなり長い間戸惑いましたが、明確な答えを見つけることができませんでした..

SQL Server 2005 Express でクエリ アナライザを使用しているときに、次のような 16 進数値を送信できるのはなぜですか。

UPDATE Table_A
SET    COLUMN_B = 0xabc123ff (example)
WHERE  (COLUMN_A = 'hello')

それをC#で使用すると、「COLUMN_B付近の構文が正しくありません」というエラーが表示されます

そして、ストアド プロシージャを作成すると、ビジュアル スタジオで開くだけでも機能するようです。

ただし、Visual Studio で c# を使用してこのストアド プロシージャを呼び出すと、「COLUMN_B 付近の構文が正しくありません」というエラーが表示されます。

===追加情報===

COLUMN_B は varbinary (1740) です。

入力をvarcharとして受け取ってから変換しようとしましたが、これも好きではありません。また、それを変換することはできません..

私が望むことをしているように見えるいくつかのクエリを見てきましたが、それらはかなり大きいです。クエリを介してデータを入力する場合とまったく同じように C# コードが処理されるようにするにはどうすればよいですか?

これが少し不明確に思われる場合はお詫びします。現在手元にないため、必要に応じて後でより多くのコードを提供します..

アップデート

以下に示すビットは、SQL ストアド プロシージャを呼び出すために使用するものです。これまでのところ、他のすべてのストアド プロシージャで正常に機能しています。

 using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["WebDB"].ConnectionString))
                {
                    //State the Stored Proc and add Values to 'cmd' to pass to the Stored Proc
                    SqlCommand cmd = new SqlCommand("_USP_inv", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("Name", C5_name.Text);
                    cmd.Parameters.AddWithValue("Inventory", inventory);

                    try
                    {
                        // Open Connection and execute Stored Proc
                        conn.Open();
                        cmd.ExecuteScalar();

                    ....
                    finally
                    {
                        if (conn.State == System.Data.ConnectionState.Open)
                        {
                            //Close connection IF open
                            conn.Close();
                        }
                    }
                }

現在のストアドプロシージャ

    @Name varchar(10),
    @Inventory varbinary(1740)
AS  
    UPDATE Inventory
    SET Inventory = @Inventory
    WHERE (Name = @Name)
4

2 に答える 2

1

サンプル値は Int64 ですが、MSBuild は AddWithValue の Int32 バージョンを使用しています。

cmd.Parameters.AddWithValue("Inventory", 0xabc123ff).DbType = DbType.Int64;

それはコンパイルされ、挿入が機能します。ただし、それがあなたの望むものかどうかは完全にはわかりません。Management Studio で 0xabc123ff を使用すると、テーブルは 0xABC123FF でロードされます。ただし、C# で実行すると、0x00000000ABC123FF として読み込まれます。

本当に必要なのはバイト配列だと思います。はい、これでうまくいきます。Management Studio と同じように、0xABC123FF を保存します。

byte[] j = new byte[] { 0xab, 0xc1, 0x23, 0xff };
cmd.Parameters.AddWithValue("Inventory", j);

配列が null になる可能性がある場合、最も簡単な方法は、ストアド プロシージャでパラメーターをデフォルトで NULL に設定し、null の場合は C# でパラメーターを追加しないことです。

if (j != null) {   cmd.Parameters.AddWithValue("Inventory", j);   }
于 2011-12-09T04:16:53.310 に答える
0

情報を 16 進数として取得する必要がある場合は、SQL に渡す前に C# アプリ側でデータを変換する小さなワーカー クラスを構築する価値があるかもしれません。これは、一度に 2 文字ずつ 16 進数を ASCII に変換することで実行できますInt32.Parse(string, NumberStyle.HexNumber) と同等

これが要件に当てはまるかどうかはわかりませんが、1 つのオプションです。

于 2011-12-06T14:05:22.050 に答える