(a) 1 つのレコードをテーブルに挿入し、(b) DataSet を使用し、(c) ストアド プロシージャを使用しない場合は、次のようにすることができます。
dataAdapter を作成しますが、select ステートメントに WHERE 1=0 を追加して、テーブル全体をダウンロードする必要がないようにします - パフォーマンスのためのオプションの手順
スコープ ID 選択ステートメントと出力パラメーターを使用してカスタム INSERT ステートメントを作成します。
通常の処理を行い、データセットを埋め、レコードを追加し、テーブルの更新を保存します。
パラメータから ID を直接抽出できるようになりました。
例:
'-- post a new entry and return the column number
' get the table stucture
Dim ds As DataSet = New DataSet()
Dim da As SqlDataAdapter = New SqlDataAdapter(String.Concat("SELECT * FROM [", fileRegisterSchemaName, "].[", fileRegisterTableName, "] WHERE 1=0"), sqlConnectionString)
Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
' since we want the identity column back (FileID), we need to write our own INSERT statement
da.InsertCommand = New SqlCommand(String.Concat("INSERT INTO [", fileRegisterSchemaName, "].[", fileRegisterTableName, "] (FileName, [User], [Date], [Table]) VALUES (@FileName, @User, @Date, @Table); SELECT @FileID = SCOPE_IDENTITY();"))
da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
With da.InsertCommand.Parameters
.Add("@FileName", SqlDbType.VarChar, 1024, "FileName")
.Add("@User", SqlDbType.VarChar, 24, "User")
.Add("@Date", SqlDbType.DateTime, 0, "Date")
.Add("@Table", SqlDbType.VarChar, 128, "FileName")
' allow the @FileID to be returned back to us
.Add("@FileID", SqlDbType.Int, 0, "FileID")
.Item("@FileID").Direction = ParameterDirection.Output
End With
' copy the table structure from the server and create a reference to the table(dt)
da.Fill(ds, fileRegisterTableName)
Dim dt As DataTable = ds.Tables(fileRegisterTableName)
' add a new record
Dim dr As DataRow = dt.NewRow()
dr("FileName") = fileName
dr("User") = String.Concat(Environment.UserDomainName, "\", Environment.UserName)
dr("Date") = DateTime.Now()
dr("Table") = targetTableName
dt.Rows.Add(dr)
' save the new record
da.Update(dt)
' return the FileID (Identity)
Return da.InsertCommand.Parameters("@FileID").Value
しかし、これと同じことをするのはかなり長い道のりです...
' add the file record
Dim sqlCmd As SqlCommand = New SqlCommand(String.Concat("INSERT INTO [", fileRegisterSchemaName, "].[", fileRegisterTableName, "] (FileName, [User], [Date], [Table]) VALUES (@FileName, @User, @Date, @Table); SELECT SCOPE_IDENTITY();"), New SqlConnection(sqlConnectionString))
With sqlCmd.Parameters
.AddWithValue("@FileName", fileName)
.AddWithValue("@User", String.Concat(Environment.UserDomainName, "\", Environment.UserName))
.AddWithValue("@Date", DateTime.Now())
.AddWithValue("@Table", targetTableName)
End With
sqlCmd.Connection.Open()
Return sqlCmd.ExecuteScalar