8

SQL Server から返される値を出力したいと考えています。

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama') 
   BEGIN   
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea')  
   END 
ELSE  
   BEGIN 
    Print 'Duplicate' 
   END

このクエリは、影響を受ける行数または重複のいずれかを返します

この Duplicate を C# で使用したいMessageBox.Show()

string query1 = "If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemName') BEGIN  INSERT INTO ItemList (ItemName) VALUES('txtItemName')  END ELSE  BEGIN Print 'Duplicate' END";
            SqlCommand cmd = new SqlCommand(query1, conn);
            SqlDataReader dr;
            conn.Open();
            dr=cmd.ExecuteReader();
            conn.Close();
MessageBox.Show(dr);

これを行うために使用する方法がわかりませんdr。ここに複製を印刷するのを手伝ってください

MessageBox.Show(dr);

ここで何をする必要がありますか?

4

2 に答える 2

7

数年遅れていますが、 SqlConnection オブジェクトのInfoMessage イベントにイベントハンドラーをアタッチすることで、印刷/情報テキスト(最初に要求されたように)を取得できるはずです-

ただし、 (何らかの理由で)このスレッドで言及されている代替手段を使用できない場合にのみ、これを行ってください。

static void Main(string[] args)
{
    using (SqlConnection connection = new SqlConnection(@"someconnectionstring"))
    {
        connection.Open();
        using(SqlCommand command = new SqlCommand("test", connection))
        {
            connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt); // Do something with DataTable
            }
        }
    }
}

static void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    // e contains info message etc
}
于 2012-02-01T08:49:35.650 に答える
1

ADO.NET を使用すると、SQL クエリから情報を返すための 4 つのオプションがあります。

  • DataSet オブジェクトを使用して、返された行を収集し、戻り値と戻りパラメーターに加えてこれらの行を操作します。
  • DataReader オブジェクトを使用して、返された行を収集し、これらの行を移動し、戻り値と戻りパラメーターを収集します。
  • ExecuteScalar メソッドを使用して、結果の最初の行の最初の列から値を返し、戻り値と戻りパラメーターを返します。これは、集計関数で最も役立ちます。
  • ExecuteNonQuery メソッドを使用して、戻りパラメーターと戻り値のみを返します。返された行はすべて破棄されます。これは、アクション クエリを実行する場合に最も役立ちます。

これらはすべて、コマンド オブジェクトから呼び出されるメソッドです。

猫の皮を剥ぐにはさまざまな方法があり、出力パラメーターを使用したり、ExecuteScalar を使用したり、戻り値を使用したり、ダミーのレコードセットを使用したりできます。

クエリから戻り値を取得するには、C# で次のようなことができるはずです。

// add a new parameter, with any name we want - its for our own use only 
SqlParameter sqlParam = com.Parameters.Add("@ReturnValue", SqlDbType.Int); 
// set the direction flag so that it will be filled with the return value 
myParm.Direction = ParameterDirection.ReturnValue;

上記のコードは、必要に応じて設定できる戻り値をキャプチャします。おそらく、存在する場合は 0 、存在しない場合は 1 です。

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama')    
   BEGIN      
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea') 
    Return 0;    
   END    
ELSE     
   BEGIN    
    Return 1;    
   END 

ただし、上記のアドバイスには少し注意が必要です。通常、Linq-to-SQL や NHibernate などの ORM を使用するか、ストアド プロシージャを使用します。インライン SQL は非常に面倒です。したがって、私の答えは一般的に正しいはずですが、必要に応じて正確に機能させるには、おそらくいくつかの詳細を検討する必要があります.

于 2010-01-08T12:30:27.097 に答える