Я использую параметр с табличным значением с определенным пользователем типом таблицы, вот мой код ниже. Я пытаюсь заполнить свою хранимую процедуру из таблицы данных.
ИЗМЕНИТЬ ПРОЦЕДУРУ [dbo]. [TableName] @dt КАК dbo.DataTableAsType ТОЛЬКО ДЛЯ ЧТЕНИЯ
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();
}
}





Вероятно, вы пытаетесь добавить внешний ключ перед созданием базы данных. Попробуйте создать их, а после обновите их, добавив внешние ключи.
[Редактировать]
Здесь:
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);
Я создал без ограничений, затем попытался вернуться и обновить внешние ключи и получить ту же ошибку
ALTER TABLE Аккаунт ДОБАВИТЬ ИНОСТРАННЫЙ КЛЮЧ (CUST_NUM) ССЫЛКИ CUSTOMER_1 (CUST_NUM);
СОЗДАТЬ ТАБЛИЧНУЮ АККАУНТ (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));
ЗАТЕМ я добавляю Customer_1, затем возвращаюсь и пытаюсь изменить таблицу.
В вашей таблице ACCOUNT и CUSTOMER_1 есть циклическая ссылка на внешний ключ, из-за которой возникла проблема. Подобные проблемы уже описаны здесь и здесь.
Хочу предложить вам сделать упрощенную структуру базы данных. Насколько я понимаю, вам не нужен столбец CUST_NUM в вашей таблице ACCOUNT, который вы пытаетесь использовать как внешний ключ из таблицы CUSTOMER_1. Постарайтесь сделать структуру таблицы вашей базы данных максимально простой, как это предлагается во второй ссылке, которую я предоставил выше.
Да, я добавлял столбец с номером клиента, чтобы я мог сказать, что он связан с учетной записью.
Я думаю, что наличие ACCT_ID в таблице CUSTOMER_1 вполне соответствует вашим требованиям.
ALTER TABLE CUSTOMER_1 -> ДОБАВИТЬ ИНОСТРАННЫЙ КЛЮЧ (ACCT_ID) ССЫЛКИ НА АККАУНТ (ACCT_ID); ОШИБКА 1215 (HY000): невозможно добавить ограничение внешнего ключа.
Вы удалили внешний ключ из таблицы счетов?
Да это удалено
ОК. Вы сбросили старую таблицу счетов и создали новую?
Да. Я просто начал полностью заново.
Уверены, у вас есть соответствующие индексы?