C# 如何在不使用参数的情况下在SQLServer uing sql查询中交互映像

C# 如何在不使用参数的情况下在SQLServer uing sql查询中交互映像,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,我正在尝试在数据库中插入图像。但是我不想使用参数,因为我的编码模式设置不允许这样做。有办法吗 我知道下面的代码会插入图像 byte[] imageData = ReadFile(txtImagePath.Text); SqlConnection CN = new SqlConnection(txtConnectionString.Text); string qry = "insert into ImagesStore (ImageData) values( @ImageData)"; SqlCo

我正在尝试在数据库中插入图像。但是我不想使用参数,因为我的编码模式设置不允许这样做。有办法吗

我知道下面的代码会插入图像

byte[] imageData = ReadFile(txtImagePath.Text);
SqlConnection CN = new SqlConnection(txtConnectionString.Text);
string qry = "insert into ImagesStore (ImageData) values( @ImageData)";
SqlCommand SqlCom = new SqlCommand(qry, CN);
SqlCom.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
//Open connection and execute insert query.
CN.Open();
SqlCom.ExecuteNonQuery();
CN.Close();
但是,我希望在没有SQL参数的情况下使用类似的东西

byte[] imageData = ReadFile(txtImagePath.Text);
SqlConnection CN = new SqlConnection(txtConnectionString.Text);
string qry = "insert into ImagesStore (ImageData) values(IMAGE DATA IN SOME FORM MAY BE 0101000101011001100 I dont know!)";
SqlCommand SqlCom = new SqlCommand(qry, CN);
//Open connection and execute insert query.
CN.Open();
SqlCom.ExecuteNonQuery();
CN.Close();

我还没有使用sqlserver,但是您可以使用blob来插入任何二进制对象,而不考虑其格式吗?
我发现这篇文章可能会有所帮助:

我没有使用sqlserver,但是您可以使用blob,在其中插入任何二进制对象,而不考虑其格式吗?
我发现这篇文章可能会有所帮助:

您可以使用十六进制表示法:

INSERT INTO imagestore (imagedata) VALUES (0xFF01); 插入到imagestore中 (图像数据) 价值观 (0xFF01);
将一个包含两个字节(255和1)的blob插入表中

您可以使用十六进制表示法:

INSERT INTO imagestore (imagedata) VALUES (0xFF01); 插入到imagestore中 (图像数据) 价值观 (0xFF01);
将一个包含两个字节(255和1)的blob插入到表中

以下是我所做的:首先将图像转换为字节,然后将字节转换为sting,并使用insert SQL插入sting,以检索图像,我收回了步骤

    //convert to stirng
    Bitmap bmp = new Bitmap(@"D:/bmp.bmp");
    MemoryStream mem = new MemoryStream();
    bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg );
    byte[] b = mem.ToArray();
    mem.Close();
    mem = null;
    System.Text.UnicodeEncoding a = new UnicodeEncoding();
    string s = System.Text.Encoding.Unicode .GetString(b);
    //test
    File.WriteAllText(@"D:/txt.txt", s);

    //convert back to image
    Image newImage;
    byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
    using (MemoryStream ms = new MemoryStream(bytes.Length))
    {
        ms.Write(bytes, 0, bytes.Length);
        newImage = Image.FromStream(ms);
        ms.Close();
    }
    //test 
    pictureBox1.Image = newImage;
    //It works!
    //So just fire the SQL
   con.Executenonquery("insert into ImageDb ('img') values (" + s +")") ;

下面是我所做的:首先将图像转换为字节,然后将字节转换为sting,并使用insert SQL插入sting,以检索我收回步骤的图像

    //convert to stirng
    Bitmap bmp = new Bitmap(@"D:/bmp.bmp");
    MemoryStream mem = new MemoryStream();
    bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg );
    byte[] b = mem.ToArray();
    mem.Close();
    mem = null;
    System.Text.UnicodeEncoding a = new UnicodeEncoding();
    string s = System.Text.Encoding.Unicode .GetString(b);
    //test
    File.WriteAllText(@"D:/txt.txt", s);

    //convert back to image
    Image newImage;
    byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
    using (MemoryStream ms = new MemoryStream(bytes.Length))
    {
        ms.Write(bytes, 0, bytes.Length);
        newImage = Image.FromStream(ms);
        ms.Close();
    }
    //test 
    pictureBox1.Image = newImage;
    //It works!
    //So just fire the SQL
   con.Executenonquery("insert into ImageDb ('img') values (" + s +")") ;
不要

很抱歉回避您的问题,但为什么要将图像作为blob插入?根据我的经验,这几乎从来都不是一个好主意。而是将映像文件的路径存储在磁盘上

可能是rour要求让您别无选择,只能将图像作为blob存储在db中,但我会认真重新考虑这些要求,因为存储二进制(图像)数据几乎总是一个坏主意。

不要

很抱歉回避您的问题,但为什么要将图像作为blob插入?根据我的经验,这几乎从来都不是一个好主意。而是将映像文件的路径存储在磁盘上



可能是rour要求让您别无选择,只能将图像作为blob存储在db中,但我会认真地重新考虑将其作为二进制(图像)存储的要求数据几乎总是一个坏主意。

我重新构建了我的问题,我想我已经找到了解决方案,请看一看

我重新构建了我的问题,我想我已经找到了解决方案,请看一看

,但参数是要走的路。您的编码模式以何种方式不允许使用参数?您需要彻底反思“无参数”编码实践——拥有参数是防止SQL注入的最佳防御措施。没有参数打开了漏洞利用的大门,应该不惜一切代价加以避免……@Albin这是因为我使用的是一个框架,在这个框架中,我必须将整个insert sql作为字符串传递,除了将图像转换为字节流之外,别无他法!这听起来像是一个糟糕的框架,它会给你带来更多的麻烦。浮点值和日期对区域设置很敏感,更不用说可能的SQL注入攻击了。我们想知道,为什么即使在今天这个时代,SQL注入漏洞仍然比比皆是。正如阿尔宾所说,任何这样的框架都是一个糟糕的框架。在这个框架中,除此之外,您可能还会遇到很多其他问题,但参数是解决问题的方法。您的编码模式以何种方式不允许使用参数?您需要彻底反思“无参数”编码实践——拥有参数是防止SQL注入的最佳防御措施。没有参数打开了漏洞利用的大门,应该不惜一切代价加以避免……@Albin这是因为我使用的是一个框架,在这个框架中,我必须将整个insert sql作为字符串传递,除了将图像转换为字节流之外,别无他法!这听起来像是一个糟糕的框架,它会给你带来更多的麻烦。浮点值和日期对区域设置很敏感,更不用说可能的SQL注入攻击了。我们想知道,为什么即使在今天这个时代,SQL注入漏洞仍然比比皆是。正如阿尔宾所说,任何这样的框架都是一个糟糕的框架。在这个框架中,除此之外,您可能还会遇到很多其他问题。但是如何将图像转换为字节。。。你知道吗?你已经有一个byte[]数组了。您只需要将每个字节转换为十六进制表示形式。如果您坚持将图像存储在数据库中而不带参数,以上答案似乎是最好的。只需进行“字节数组到十六进制字符串”的转换并插入结果数据。我不会在多兆字节的图像上这样做,因为十六进制编码使它变大了一倍。对于小图标,这可能是可以接受的。但如何将图像转换为字节。。。你知道吗?你已经有一个byte[]数组了。您只需要将每个字节转换为十六进制表示形式。如果您坚持将图像存储在数据库中而不带参数,以上答案似乎是最好的。只需进行“字节数组到十六进制字符串”的转换并插入结果数据。我不会在多兆字节的图像上这样做,因为十六进制编码使它变大了一倍。对于小图标,它可能是可以接受的。它使用参数,所以不是答案!它使用参数,所以不是答案!我认为你很幸运它能起作用。事实上,确实存在无法映射到有效Unicode字符的字节组合。大约有100.000个Unicode字符使用UTF-8、UTF-16或UTF-32编码为字节。如果您使用的是UTF-8(我无法从代码中看出),那么就存在所谓的“代理项对”,并且并非所有字节组合都有效。如果你使用UTF-32,有40亿个可能的组合,它们肯定不会全部映射到100000个字符。简而言之:不要使用这段代码,因为它可能会在某个时候失败,并且不可能调试。我认为你很幸运它能工作。事实上,确实存在无法映射到有效Unicode字符的字节组合。大约有100.000个Unicode字符是enc