2012-01-18 7 views
1

はのは、それは私の選択クエリだとしましょう:私はデータグリッド上でそのクエリの結果をバインドするためにC#を使用していますSELECTコマンドを知ってSQL UPDATEコマンドを作成しますか?

SELECT 
    CNDSC.NAME, 
    CNEA.ATRBT AS ATR, 
    ISNULL(CNEXTRA.CNVAL,'') AS CNVAL, 
    ISNULL(CNEXTRA.INRDR,'') AS INRDR 
FROM 
    CNDSC 
    INNER JOIN CNEA 
     ON CNEA.ELEMS LIKE '%'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%' AND 
      NOT CNEA.ELEMS LIKE '%1'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%' 
    LEFT OUTER JOIN CNEXTRA 
     ON CNEXTRA.ATR LIKE CNEA.ATRBT AND 
      CNEXTRA.NAME LIKE @con 
WHERE 
    CNDSC.NAME LIKE @con; 

。しかし、私はSQLDataAdapterの "自動更新"コマンドを使用しようとすると、私の選択で複数のテーブルの使用のために例外が発生します。

CNEXTRA.CNVALテーブルを更新する場合、UPDATEコマンドはどのように見えますか? CNVALが空でINSERTコマンドを使用する必要がある場合、どうすればよいでしょうか?

ありがとうございました。

+0

SQLサーバー(MSSQL、Oracleの、???)MS SQL Serverでは、いくつかの結合ベースのビュー定義で更新を実行できます。 –

+0

これはMSSQL DBです – oopbase

+0

どのバージョンのSQL Serverですか? – NotMe

答えて

2

SQLサーバーのバージョンによっては、UPDATEではなくMERGEを使用できます。以下のような

何か:それはない場合MERGE statementは、レコードが存在する場合は更新を実行または挿入します

DECLARE @CNVAL varchar(100) = 'test' 
DECLARE @ATRBT varchar(100) = 'some attribute' 
DECLARE @CON varchar(100) = 'the name' 

MERGE into CNEXTRA as target 
    USING (VALUES(@CON, @ATRBT, @CNVAL)) 
     AS source([Name], ATRBT, CNVAL) 
     ON (target.ATRBT = source.ATRBT) 
     AND (target.[Name] = source.[Name]) 
    WHEN MATCHED THEN 
    UPDATE SET 
     CNVAL = source.CNVAL 
    WHEN NOT MATCHED THEN 
    INSERT([Name], ATRBT, CNVAL) 
    VALUES(source.[Name], source.ATRBT, source.CNVAL) 
; 

+0

残念ながら、MSSQLサーバーはMERGEコマンドをサポートしていません...これを実現する他のチャンスはありますか? – oopbase

+0

@ Forlan07:あなたの次の最良の賭けは、レコードが存在するかどうかを確認するためにselectステートメントを書いてから、そこから定期的な挿入や更新をするかどうかを決定することです。 – NotMe

+0

私のdbの互換性レベルを100に変更しました。このコマンドが機能します。しかし何らかの理由で、私がCNVALを更新すると、コマンドはATRBTが設定されているすべての列を更新します。したがって、文はCONがtarget.Nameと等しいかどうかをチェックしません。どうすればそれが可能ですか? – oopbase

0

私はこのコードをテストしていませんが、このような何かが動作するはずです...(しかし、あなたはあなた自身の挿入、更新を書いて、クエリを削除する必要があります)

public static DataSet UpdateSqlRows(
    string connectionString, 
    string selectQuery, 
    string insertQuery, 
    string updateQuery, 
    string deleteQuery, 
    DataSet dataSet) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     using (SqlDataAdapter adapter = new SqlDataAdapter()) 
     { 
      adapter.SelectCommand = new SqlCommand(selectQuery, connection); 

      connection.Open(); 

      SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 

      // Assign your own Insert/Update/Delete commands 
      adapter.InsertCommand = new SqlCommand(insertQuery); 
      adapter.UpdateCommand = new SqlCommand(updateQuery); 
      adapter.DeleteCommand = new SqlCommand(deleteQuery); 

      //Without the SqlCommandBuilder this line would fail 
      adapter.Update(dataSet); 

      return dataSet; 
     } 
    } 
} 
関連する問題