Как получить общее количество записей в хранимой процедуре и код C #? - PullRequest
0 голосов
/ 04 мая 2018

Я использую табличный параметр с пользовательским типом таблицы, вот мой код ниже. Я пытаюсь заполнить мою хранимую процедуру из таблицы данных.

ALTER PROCEDURE [dbo]. [TableName] @dt AS dbo.DataTableAsType READONLY

AS
BEGIN
INSERT INTO dbo.[DataTableAsType]
    ([Column names]) --There are 89 column names
SELECT
([ColumnNames])
FROM @dt
END

Second Stored procedure
@totalRecords int OUTPUT
INSERT INTO dbo.tablename1 FROM dbo.tablename2
SELECT @totalRecords = COUNT(*) FROM dbo.[tableName2]







public void InsertDataTableAF2CSV(string ext)
    {

        DataTable tvp = new DataTable();
        string[] arr = new string[89] {"names go here"};

// добавляем 89 имен столбцов 1 на 1 tvp.Columns.Add (new DataColumn («имя столбца», typeof (строка)));

       //populate datarows I currently have over 1,000 rows. 
        DataRow row;
        for (int i = 0; i <= arr.Length; i++)
        {
            row = tvp.NewRow();
            row["Column name"] = i;

            //I add all 89 column names = i then I add rows.
            tvp.Rows.Add(row);
        }
        //read the file name I entered              
        tvp= ReadFile(filename, " ", null);

        //Passing a Table-Valued Parameter to a Stored Procedure
        using (SqlConnection con = new SqlConnection(connection name))
        {
            connection.Open();
            //Execute the cmd
            // Configure the command and parameter. 
            SqlCommand cmd = new SqlCommand("dbo.storedprocedure", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 5000;
            ///SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", tvp);
            // Create a DataTable with the modified rows.  
            DataTable addedCategories = tvp.GetChanges(DataRowState.Added);
            // these next lines are important to map the C# DataTable object to the correct SQL User Defined Type
            SqlParameter parameter = new SqlParameter("@dt", SqlDbType.Structured)
            {
                //TypeName = "dbo.DataTableAsType",
                TypeName = "dbo.importDataTable",
                Value = tvp
            };                                   
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ваша таблица ACCOUNT и CUSTOMER_1 имеют круговую ссылку на внешний ключ, которая вызвала проблему. Подобные проблемы уже описаны здесь и здесь .

Я бы хотел предложить вам упростить структуру базы данных. Насколько я понимаю, вам не нужен столбец CUST_NUM в таблице ACCOUNT, для которого вы пытаетесь использовать внешний ключ из таблицы CUSTOMER_1. Постарайтесь сохранить структуру таблицы базы данных настолько простой, насколько это возможно, как это предлагается во второй ссылке, которую я предоставил выше.

0 голосов
/ 04 мая 2018

Возможно, вы пытаетесь добавить внешний ключ перед созданием базы данных. Попробуйте создать их и после того, как вы сможете обновить их, добавив внешние ключи.

[Изменить]

Здесь:

CREATE TABLE ACCOUNT
(ACCT_ID CHAR(10),
BRANCH_ID CHAR(20),
CUST_NUM CHAR(15),
ACCT_TYPE CHAR(20),
FOREIGN KEY (BRANCH_ID) REFERENCES BRANCH_1 (BRANCH_ID),
FOREIGN KEY (CUST_NUM) REFERENCES CUSTOMER_1 (CUST_NUM));

Вы пытаетесь сослаться на CUSTOMER_1 (CUST_NUM), который еще не существует.

[Редактировать 2]

Кажется, вам не хватает некоторых индексов. Попробуйте это:

Возможно, вы пытаетесь добавить внешний ключ перед созданием базы данных. Попробуйте создать их и после того, как вы сможете обновить их, добавив внешние ключи.

[Изменить]

Здесь:

CREATE TABLE ACCOUNT
(ACCT_ID CHAR(10),
BRANCH_ID CHAR(20),
CUST_NUM CHAR(15),
ACCT_TYPE CHAR(20),
FOREIGN KEY (BRANCH_ID) REFERENCES BRANCH_1 (BRANCH_ID),
FOREIGN KEY (CUST_NUM) REFERENCES CUSTOMER_1 (CUST_NUM));

Вы пытаетесь сослаться на CUSTOMER_1 (CUST_NUM), который еще не существует.

[Редактировать 2]

Попробуйте это:

CREATE TABLE BRANCH_1
    (BRANCH_ID CHAR(20) PRIMARY KEY,
    BRANCH_NAME CHAR(20),
    BRANCH_ADDRESS CHAR(30));

CREATE TABLE EMPLOYEE
    (EMP_ID CHAR(4) PRIMARY KEY,
    EMP_FNAME CHAR(50),
    EMP_LNAME CHAR(50),
    BRANCH_ID CHAR(20));

    CREATE TABLE ACCOUNT
    (ACCT_ID CHAR(10),
    BRANCH_ID CHAR(20),
    CUST_NUM CHAR(15),
    ACCT_TYPE CHAR(20));

CREATE TABLE CUSTOMER_1
    (CUST_NUM CHAR(15),
    CUS_FNAME CHAR(50),
    CUS_LNAME CHAR(50),
    CUS_ADDRESS CHAR(15),
    BRANCH_ID CHAR(20),
    ACCT_ID CHAR(10),
    LOAN_ID CHAR(10));

CREATE TABLE LOAN
    (LOAN_ID CHAR(10),
    LOAN_NAME CHAR(50),
    LOAN_TYPE CHAR(20),
    CUST_NUM CHAR(15));


ALTER TABLE CUSTOMER_1 ADD INDEX(CUST_NUM);
ALTER TABLE ACCOUNT ADD INDEX(ACCT_ID);
ALTER TABLE EMPLOYEE ADD FOREIGN KEY (BRANCH_ID) REFERENCES BRANCH_1 (BRANCH_ID);
ALTER TABLE ACCOUNT ADD FOREIGN KEY (BRANCH_ID) REFERENCES BRANCH_1 (BRANCH_ID);
ALTER TABLE ACCOUNT ADD FOREIGN KEY (CUST_NUM) REFERENCES CUSTOMER_1 (CUST_NUM);
ALTER TABLE CUSTOMER_1 ADD FOREIGN KEY (BRANCH_ID) REFERENCES BRANCH_1 (BRANCH_ID);
ALTER TABLE CUSTOMER_1 ADD FOREIGN KEY (ACCT_ID) REFERENCES ACCOUNT (ACCT_ID);
ALTER TABLE LOAN ADD FOREIGN KEY (CUST_NUM) REFERENCES CUSTOMER_1 (CUST_NUM);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...