基本的には、データテーブルを作成してストアドプロシージャとして渡すC#アプリケーションがあります。しかし、それはすべて動作します。私がしたいのは、渡されたデータテーブルにロジックを追加することです。ストアドプロシージャのWHERE句でデータ型を使用する方法
たとえば、以下のテストではRealInsertNewRecords
というプロシージャが表示されます。これは以下
「@dataTable」必ず重複する主キー違反が発生しませんが、私はエラー
がスカラー変数を宣言する必要があり得ることを確認しようとする任意のヘルプは、完全なテストです感謝。ありがとう!
ストアドプロシージャ
RealInsertNewRecords
を明確にこれは私の最善の方法ではないが、私はちょうど方法を考え出しC#
using System; using System.Data; using System.Data.SqlClient; namespace testApp { class Program { static void Main(string[] args) { string SQLServer = @""; SqlConnection sqlCon = new SqlConnection("Data Source=" + SQLServer + ";Initial Catalog=myTestDB;Integrated Security=SSPI;"); sqlCon.Open(); InsertNewRecords(sqlCon, testTable1()); InsertNewRecords(sqlCon, testTable2()); sqlCon.Dispose(); } public static DataTable testTable1() { DataTable dt = new DataTable(); dt.Columns.Add("myTestPK"); string[] items = new string[] { "apples", "pears" }; for (int i = 0; i < items.Length; i++) { DataRow dr = dt.NewRow(); dr[0] = items[i]; dt.Rows.Add(dr); } return dt; } public static DataTable testTable2() { DataTable dt = new DataTable(); dt.Columns.Add("myTestPK"); string[] items = new string[] { "apples", "pears", "grapes" }; for (int i = 0; i < items.Length; i++) { DataRow dr = dt.NewRow(); dr[0] = items[i]; dt.Rows.Add(dr); } return dt; } public static void InsertNewRecords(SqlConnection sqlCon, DataTable parameterTable) { SqlCommand cmd = new SqlCommand(); cmd.CommandText = "InsertNewRecords"; cmd.Parameters.AddWithValue("dataTable", parameterTable); cmd.Connection = sqlCon; cmd.CommandType = CommandType.StoredProcedure; cmd.ExecuteNonQuery(); } } }
SQL
if exists (select 'x' from sys.databases where [name] = 'myTestDB') begin drop database myTestDB; end Create database myTestDB; GO USE [myTestDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[myTable] ( [myTestPK] [nvarchar](50) NOT NULL, CONSTRAINT [PK_myTable] PRIMARY KEY CLUSTERED ([myTestPK] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO create Type [dbo].myTableParameters as table ( myTestPK nvarchar(10) ) go create procedure InsertNewRecords(@dataTable [dbo].myTableParameters readonly) as begin insert into myTable select * from @dataTable; end go --This is what i really want to do! create procedure RealInsertNewRecords(@dataTable [dbo].myTableParameters readonly) as begin insert into myTable select * from @dataTable where not exists (select 'x' from myTable m where m.myTestPK = @dataTable.myTestPK) end
誰かがdownvoteを説明したいですか? – JL1