سؤال

وكنت قد بحثت في الموقع SQLTeam لكن الآن أواجه مشكلة جديدة سببا لدي عمود الهوية ومثالهم لا.

ولدي SQL Server 2008 و VS 2008. واني اسعى الى تنفيذ InsertPIF SP باستخدام C # وUDT الطاولة، ولكن أنا على الحصول على استثناء. لقد بحثت في موقع على شبكة الانترنت SQLTeam المثال مع جدول UDT، ولكن على سبيل المثال ليس لديها عمود هوية مثل الألغام لا.

ومع ذلك، لا يكون الجدول مثالهم عمود الهوية مثل الألغام. ما أحاول القيام به يجب أن تكون بسيطة. لقد حاولت العديد من أشكال مختلفة من هذا، ولكن أساسا:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable SELECT strRow FROM @InputFileParam
GO

حيث

CREATE TABLE [dbo].[ParentTable](
    [ParentID] [int] IDENTITY(1,1) NOT NULL,
    [strInput] [varchar](8000) NULL,
PRIMARY KEY NONCLUSTERED 
(...)

ونوع:

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
    [NumCols] [int] IDENTITY(1,1) NOT NULL,
    [strRow] [varchar](500) NOT NULL,
    PRIMARY KEY CLUSTERED 
(...)

ما أحاول القيام به هو تنفيذ SP أعلاه لإدراج سجلات جديدة في ParentTable. مثال:

INSERT INTO ParentTable(strInput) VALUES ('A3|BB|C|DDD')
INSERT INTO ParentTable(strInput) VALUES ('A4|GOB|BLDY|GOOK')
INSERT INTO ParentTable(strInput) VALUES ('A5|Hello|My|Darling')

وهنا هو أكثر من بلدي C # رمز قبل قسم AppendData:

DataTable dt = new DataTable();
String[] header = myStringArray[0].Split('|');

DataRow dr = dt.NewRow();
DataColumn dc = new DataColumn();
dc.DataType = typeof(Int32);
dc.ColumnName = “NumCols”;
dc.AutoIncrement=true;
dt.Columns.Add(dc);

DataColumn dc2 = new DataColumn();
dc2.DataType = typeof(string);
dc2.ColumnName = “strRow”;
dt.Columns.Add(dc2);
dr["NumCols"] = 1;
dr["strRow"] = "AA|BBB|CC|DD|E";
dt.Rows.Add(dr);

...
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "dbo.InsertPIF";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                SqlParameter param = cmd.Parameters.AddWithValue("@InputFileParam", SqlDbType.Structured);

        param.Value = dt;
        conn.Open();
        RowsAffected = cmd.ExecuteNonQuery();

وأنا وضعت الهوية إلى أن تحول لParentTable، ولكن يبدو أن لدي لتنفيذ هذا كل دورة، لذلك أنا غير متأكد من كيفية إزالة شرط الهوية أو آخر لجعل الهوية لا تزال على. استثناء:

وINSERT إلى عمود هوية لا يسمح على متغيرات الجدول. البيانات للمعلمة بقيمة الجدول 'InputFileParam "لا يتوافق مع نوع الجدول المعلمة.

وكيف يمكنني تنفيذ هذا SP؟

هل كانت مفيدة؟

المحلول

وأعتقد رولاند هو على الطريق الصحيح - الأعمدة الهوية هي بالتأكيد مشكلة. منذ الجدول الهدف النهائي الخاص بك بالفعل عمود الهوية التي سيتم شغلها التلقائى بالنسبة لك، أوصى بعدم تحديد نفس العمود الخاص بك في الجدول نوع المعرفة من قبل المستخدم (وأيضا لا تعلن مفتاح أساسي على نوع الجدول):

CREATE TYPE [dbo].[parseInputFile] AS TABLE
    ([strRow] [varchar](500) NOT NULL)

وبعد ذلك في حياتك C # رمز، أعددت فقط DataTable ومع عمود واحد:

DataTable dt = new DataTable();

DataColumn dc = new DataColumn();
dc.DataType = typeof(string);
dc.ColumnName = “strRow”;
dt.Columns.Add(dc);

ثم قم بإضافة الأعمدة الخاص بك إلى DataTable و"دينارا" - فقط مع سلسلة واحدة "strRow"

في بروك المخزنة ثم ان يحصل على استدعاء الخاصة بك مع نوع الجدول المعرفة من قبل المستخدم، فقط لمجرد إدراج سلاسل الخاص بك:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
  INSERT INTO dbo.ParentTable(strInput)
    SELECT strRow FROM @InputFileParam
GO

وينبغي أن تفعل ذلك، وآمل! (لم يكن لديه الوقت لاختبار ذلك بنفسي)

ومارك

نصائح أخرى

حسنا، أنا لم تكن قد عملت فعلا مع TVPs بعد، لذلك قد أكون مخطئا - ولكن من قراءتي، وخلفية SS العامة، I التفكير مشكلتك هي هذه:

وجدول دائمة لهاتفك عمود الهوية، لذلك يريد SS للتعامل مع ذلك لك. أنت <م> يمكن تحديد الهوية إدراج، ولكن هذا ليس فكرة جيدة ....

وشيء واحد هو محاولة لتحديد عمود لإدراج في SP الخاص بك:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable (strInput) SELECT strRow FROM @InputFileParam
GO

والشيء الآخر أن ننظر، كما اقترح تيم Lentine (بينما كنت أكتب هذه الإجابة)، هو ما إذا كان أو لم تحصل عليه في الواقع إلى الخادم. منذ كنت قد تعريف العمود NumCols في DataTable وكما هو AutoIncrement، فإنه يمكن أن تحصل عليه الاستثناء الخاص بك في C # رمز، على العنوان التالي:

...
dr["NumCols"] = 1;
...

<تحرير>

لا أعرف ما كان thnking عندما ينقر إرسال ...

إذا كان هذا هو الحال، حاول تاركة AutoIncrement عند يخلق DataTable والخاص. إذا كان <م> أنواع البيانات العمود تنسجم، هذا العقار يجب أن لا يهم عندما يصطفون TVP بأنها "نفس" كنوع SS.

ويمكن أن تكون قادمة الخطأ من الجدول parseInputFile بدلا من ذلك؟ ويعرف NumCols بمثابة تحديد المجال، ولكن في C # رمز كنت تعيين قيمة السجل إلى 1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top