VB2005 + SQL CommandBuilder使用

データーをストアドからDataTableへ受け取り,DataGridViewに表示 (CommandBuilder使用)

  Dim cn As SqlConnection
  Dim da As New SqlClient.SqlDataAdapter()
  Dim dt As New DataTable

  Private Sub a()

    Dim cmd As New SqlClient.SqlCommand(“stHoge”, cn)
    Try
      cmd.CommandType = CommandType.StoredProcedure
      cmd.Parameters.Clear
      cmd.Parameters.Add(“@ID”, SqlDbType.Int).Value = ID
      da.SelectCommand = cmd
      dt.Locale = System.Globalization.CultureInfo.InvariantCulture
      dt.Clear()
      Dim commandBuilder As New SqlClient.SqlCommandBuilder(da)
      da.Fill(dt)
      dt.Columns(“ID”).ReadOnly = True
      DGV.DataSource = dt
    Finally
     cmd.Dispose()
    End Try

  End Sub

    ‘更新
    Private Sub b()
        da.Update(dt)
        dt.AcceptChanges()
    End Sub

SQL Server ストアドでのトランザクション

SQL Server ストアドプロシージャーでのトランザクション

CREATE PROCEDURE [dbo].[stTest1]
   @ID int
AS
Declare
   @Count int

BEGIN
    SET NOCOUNT ON;

BEGIN TRY
    BEGIN TRANSACTION

    SELECT @Count = Count(*) FROM T1
    IF @Count =0
    BEGIN
        ROLLBACK TRANSACTION
        RETURN -1 –戻る
    END

    UPDATE T2 SET a1 = 1 WHERE ID = @ID

    COMMIT TRANSACTION

END TRY

— 例外処理
BEGIN CATCH
    IF XACT_STATE() = -1
    BEGIN
       ROLLBACK TRANSACTION
    END
    IF XACT_STATE() = 1
    BEGIN
       COMMIT TRANSACTION
   END
    RETURN ERROR_NUMBER()
END CATCH

RETURN 0   

END


XACT_STATE() 関数を追加. 2010-10-16

SQL Server ストアドでのループ

SQL Server ストアドプロシージャー内でのループ (テーブル変数利用)

CREATE PROCEDURE [dbo].[stHoge]
AS
Declare
   @i int
, @Count int
, @r1 int
, @r2 int

–テーブル変数を定義
Declare
    @T1 table(
          ID int identity(1,1) –ループ用に1から順番に番号を付ける
        , a1 int
        , a2 int
        );

BEGIN
    SET NOCOUNT ON;

  –リストをテーブル変数に代入
  INSERT INTO @T1 (a1, a2)
    SELECT a1, a2 FROM Hoge1

  –ループ設定
  SELECT  @Count = Count(*) FROM @T1
  Set @i = 1

  –ループ
  WHILE @i <= @Count
  BEGIN
    SELECT @r1 = a1, @r2 = a2 FROM @T1 WHERE ID = @i
    UPDATE Hoge2 SET c1 = @r1 WHERE c2 = @r2
    Set @i = @i + 1
  END   

END


参考:カーソルを使う方法 (2014.07.04追記)

Declare
  @r1 int
, @r2 int

–カーソルの宣言
Declare Cur1 CURSOR FOR
    SELECT a1, a2 FROM Hoge1

–カーソルを開く
OPEN Cur1

–ループ
FETCH NEXT FROM Cur1 INTO @r1, @r2
WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE Hoge2 SET c1 = @r1 WHERE c2 = @r2
    FETCH NEXT FROM Cur1 INTO @r1, @r2
END

–カーソルを閉じ、開放
CLOSE Cur1
DEALLOCATE Cur1