Добавьте в таблицу SQL Server относительный путь к изображению, хранящемуся в папке моего проекта, а затем восстановите его в моей программе C # - PullRequest
0 голосов
/ 12 мая 2018

У меня есть таблица базы данных, в которой также есть столбец типа image. Определение таблицы:

CREATE TABLE [dbo].[table_battery]
(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [capacity] [int] NOT NULL,
    [description] [varchar](100) NOT NULL,
    [image] [image] NOT NULL, -- -----------<HERE IS IMAGE>------------
    [price] [float] NOT NULL,

    CONSTRAINT [PK_table_battery] 
       PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Оператор вставки:

SET IDENTITY_INSERT [dbo].[table_battery] OFF

INSERT INTO [dbo].[table_battery] ([capacity], [description], [image], [price]) 
VALUES ('Value1', 'Value2', 
        (SELECT BulkColumn 
         FROM OPENROWSET(BULK N'C:\Users\Juan\Desktop\Ingeniería Informática\2 año\2º Cuatrimestre\Programación Visual Avanzada\ProyectoFinal\AJMobile\AJMobile\scr\images\bateria.jpg', SINGLE_BLOB) AS CategoryImage), 
        'Value3')

И, как видите, здесь полный путь. Я хочу сделать что-то вроде:

(SELECT BulkColumn 
 FROM OPENROWSET(BULK N'.\..\..\scr\images\bateria.jpg', SINGLE_BLOB) AS image)

Но я не знаю, как мне этого добиться.

Кроме того, я читал, что если вы сохраняете в базе данных изображение с относительным путем, то наверняка у вас возникнут проблемы, когда вы попытаетесь восстановить его из таблицы данных ... Поэтому я хотел бы знать, как я могу получить это в моем приложении C # для использования его без проблем.

Спасибо.

1 Ответ

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

Похоже, вы хотели бы иметь SQLServer для загрузки файла. Это может быть довольно сложный сценарий: сервер SQL не может использовать относительный путь, как вам нравится. Более того, может случиться так, что ваш sqlserver не сможет получить доступ к файлу, который вы пытаетесь загрузить: что, если sqlserver работает на другом компьютере? как насчет прав доступа к файлу? (проверьте this для получения дополнительной информации об этой проблеме)

Поскольку кажется, что вы вызываете запрос из приложения c #, приложению намного проще загрузить файл и передать его содержимое в качестве параметра в запрос;

Примерно так:

void Insert()
{
    string query = @"
    INSERT INTO [dbo].[table_battery]
       ([capacity], [description], [image], [price]) 
    VALUES 
       (@capacity, @description, @fileContent, @price)";

    // setup values you want to use for the query
    int capacity = ... ;
    string descr = ... ;
    float price = ...;

    string path = ... // you can use relative or absolute path here
    byte[] fileContent = File.ReadAllBytes(path);

    SqlConnection conn = null;// get connection some how;
    using (conn)
    {
        using (SqlCommand command = new SqlCommand(query, conn))
        {
            command.Parameters.Add("@capacity", SqlDbType.Int).Value = capacity;
            command.Parameters.Add("@description", SqlDbType.NVarChar).Value = descr;
            command.Parameters.Add("@fileContent", SqlDbType.VarBinary).Value = fileContent;
            command.Parameters.Add("@price", SqlDbType.Float).Value = price;

            command.ExecuteNonQuery();
        }
    }
}

(заявление об отказе: не проверено и не скомпилировано, может потребовать некоторого редактирования)

...