Таблица SQL не генерирует

#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 должен существовать в первую очередь

Не забудьте вставить соответствующие записи о бренде, прежде чем пытаться вставить свои продукты; сначала должен существовать бренд, чтобы продукт мог ссылаться на него