添加到 SQL 服务器 table 存储在我的项目文件夹中的图像的相对路径,然后将其恢复到我的程序 C#

Add into SQL Server table a relative path of an image stored in my project folder, then recover it into my program C#

我有一个数据库 table,它还有一个类型为 image 的列。 table 的定义是:

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 añoº 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)

但我不知道如何才能做到这一点。

此外,我了解到如果您在数据库中存储具有相对路径的图像,那么当您尝试从数据中恢复它时肯定会遇到麻烦table...所以我会想知道如何将它放入我的 C# 应用程序中以便毫无问题地使用它。

谢谢。

您似乎想让 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();
        }
    }
}

(免责声明:未经测试和编译,可能需要一些编辑)