我有一個C#中的DataTable,我需要插入到表中。 DataTable是完全動態的(列沒有預先定義)。我使用C#代碼逐行插入此DataTable,但由於效率低下,我正在將DataTable批量發送到SQL存儲過程。我需要存儲過程循環遍歷,逐行插入,並返回無效數據集。循環通過動態數據集並插入存儲過程
C#代碼:
SqlConnection sqlConnection = getDBConnection();
SqlCommand command = sqlConnection.CreateCommand();
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "[dbo].[saveDataIntoTable]";
SqlParameter parameter = new SqlParameter();
//The parameter for the SP must be of SqlDbType.Structured
parameter.ParameterName = "@Sample";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = dataTable;
command.Parameters.Add(parameter);
foreach (DataRow row in dataTable.Rows)
{
System.Diagnostics.Debug.WriteLine(row.ItemArray);
if (row.ItemArray[0] == null)
{
dataTable.Rows.Remove(row);
}
}
SqlDataReader dr = command.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
//handling the dt DataTable here
存儲過程:
USE [DATABASE_NAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[saveDataIntoTable]
(
-- which accepts one table value parameter. It should be noted that the parameter is readonly
@Sample As [dbo].[SampleUserData] Readonly
)
AS
BEGIN
BEGIN TRY
Insert Into USER(USER_ID,EMAIL,PASSWORD,PASSWORD_HINT,PWD_CHANGED_DATE,
CREATED_BY,CREATED_DATE,UPDATED_BY,UPDATED_DATE,STATUS,VERSION,VALIDATE)
Select USER_ID, EMAIL,PASSWORD,PASSWORD_HINT,PWD_CHANGED_DATE,
CREATED_BY,CREATED_DATE,UPDATED_BY,UPDATED_DATE,STATUS,VERSION,VALIDATE From @Sample
END TRY
BEGIN CATCH
Select USER_ID, EMAIL,PASSWORD,PASSWORD_HINT,PWD_CHANGED_DATE,
CREATED_BY,CREATED_DATE,UPDATED_BY,UPDATED_DATE,STATUS,VERSION,VALIDATE From @Sample
END CATCH
END
我用於存儲過程的一個用戶定義的表類型:
-- Create a table data type
CREATE TYPE [dbo].[SampleUserData] As Table
(
--This type has structure similar to the DB table
USER_ID Nvarchar(20) ,
EMAIL Nvarchar(50),
PASSWORD Nvarchar(100),
PASSWORD_HINT Nvarchar(20),
PWD_CHANGED_DATE date,
CREATED_BY Nvarchar(20),
CREATED_DATE date,
UPDATED_BY Nvarchar(20),
UPDATED_DATE date,
STATUS Nvarchar(20),
VERSION Int,
VALIDATE Nvarchar(10)
);
現在,我的存儲過程一次插入整個數據。當發生異常時,它會返回整個DataSet(我不知道如何分隔行)。
PS:如果上述場景有其他方法比較容易,請告訴我。
謝謝。
啊,但我怎麼可以用它來檢查數據類型驗證,驗證無效,重複的字段都在一次?這就是我使用try catch塊的原因。 –
@DilangaThalpegama你是什麼意思的重複字段?空驗證當然可以在where子句中處理,數據類型驗證在一定程度上也可以重複記錄。 –
我不能使用where子句,因爲正如我所說DataSet是**動態生成**。我不知道列名或任何其他約束。這是使用try catch塊的原因。我試圖使用遊標來循環通過作爲參數收到的DataSet。你能幫我嗎? –