#c# #mysql #sql-server #database
Вопрос:
Я пытаюсь создать таблицу, и, похоже, возникла проблема со схемой. Пожалуйста, код ниже, все работает плавниками до ВНЕШНЕГО КЛЮЧА. Если я закомментирую ВНЕШНИЙ КЛЮЧ, он создаст таблицу, но с внешним ключом я получу следующую ошибку:
System.Data.SqlClient.SQLException: «Недопустимое имя объекта «Продукты».
Вот моя схема продуктов
public void CreateProductTable()
{
try
{
string tableName = "Products";
string schema = "ProductID int IDENTITY (1,1) PRIMARY KEY, "
"ProductName VARCHAR(50) NOT NULL , "
"ProductType VARCHAR(50) NOT NULL , "
"ProductNumber int NOT NULL , "
"ProductCondition VARCHAR(50) NOT NULL , "
"ProductActiveInactive TINYINT NOT NULL , "
"OnLoan BIT NOT NULL "
"FOREIGN KEY(BrandID) REFERENCES ProductBrands(BrandID)";
Helper.CreateTable(tableName, schema);
}
catch (Exception e)
{
// Log errors
Console.WriteLine(e.Message);
}
}
И вот моя схема продуктов бренда:
public void CreateProductBrandTable()
{
try
{
string tableName = "ProductBrands";
string schema = "BrandID int IDENTITY (1,1) PRIMARY KEY, "
"BrandName VARCHAR(50) NOT NULL";
Helper.CreateTable(tableName, schema);
}
catch (Exception e)
{
// Log errors
Console.WriteLine(e.Message);
}
}
Помощник.Возможность создания
public static void CreateTable(string tableName, string tableStructure)
{
string sql = $"CREATE TABLE {tableName} ({tableStructure})";
using (var connection = GetConnection())
{
try
{
connection.Execute(sql);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
getConnection:
public static bool DoTablesExist()
{
var connection = GetConnection();
string sql = $"SELECT COUNT(*) FROM {connection.Database}.INFORMATION_SCHEMA.TABLES"
$" WHERE TABLE_TYPE = 'BASE TABLE'";
using (connection)
{
int number = connection.QuerySingle<int>(sql);
if (number > 0)
{
return true;
}
else
{
return false;
}
}
}
Комментарии:
1. Можете ли вы сообщить нам, какой помощник. Создать таблицу-это doing…it трудно предложить решение, так как создание таблицы выполняется другой библиотекой.
2. @AmitVerma публикует обновление. Спасибо за ваш ответ 🙂
3. Вы пропускаете запятую после
OnLoad BIT NOT NULL
4. Все то же самое.
5. Возможно, я слепой, но я не вижу ни одной колонки в продуктах под названием brandId, которая приравнивалась бы к брендам продуктов. БрендИд?
Ответ №1:
Вам нужен BrandId
столбец в таблице продуктов, чтобы иметь возможность ссылаться на него как на FK. Хотя было бы неплохо иметь возможность просто писать FOREIGN KEY(x) REFERENCES(y)
, и sql server создал бы столбец X того же типа и размера, что и Y, это не работает — список столбцов для создания нуждается в X в нем/X должен существовать в первую очередь
Не забудьте вставить соответствующие записи о бренде, прежде чем пытаться вставить свои продукты; сначала должен существовать бренд, чтобы продукт мог ссылаться на него