阅读写一个varbinary

时间:2014-05-13 15:43:50

标签: sql file dataset varbinary

我正在尝试这样做:

string path = C:/blablabla/file.png
byte[] byteFile = File.ReadAllBytes(path);
string s = Encoding.ASCII.GetString(byteFile, 0, byteFile.Length);
string SQL = @"INSERT INTO UserIcon (image) VALUES('" + s + "')";

我想把文件放在sql varbinary(max)中 请求看起来不错,但我不确定

要恢复文件,我正在尝试这样做:

string SQL2 = @"SELECT image FROM UserIcon WHERE id =xx";
DataSet mydataset = connect.ExecuteSelectQuery(SQL2);
DataTable myDataTable = mydataset.Tables[0];

connect是数据库的自定义连接器,用于将数据读入DataSet 我只能给他一个字符串

然后我很丢失,我无法恢复文件。 我尝试过这样的事情:

foreach (DataRow dr in myDataTable.Rows)
{
// doesn't work
(string)dr["image"]; 
//give me a corrupted file
File.WriteAllBytes(@"C:\Users\MyName\Desktop\test\file.png", (byte[])dr["Image"]); 
}

你觉得我应该怎么做才能做到这一点?

无需告诉我“不要在数据库中放置大图像”,我的老板告诉我这样做,我们已经尝试过,这不是我的决定。

2 个答案:

答案 0 :(得分:1)

你无法取回文件,因为你打破了它。

GetString方法用于将数据返回从二进制转换为字符串,然后将其从字符串转换为二进制。如果对任意数据执行此操作,则任何未映射到字符的值都将替换为问号。

要存储二进制值,您将使用参数化查询。例如:

string sql = "insert into UserIcon (image) values (@Image)";
using (SqlCommand cmd = new SqlCommand(sql, connection) {
  cmd.Parameters.AddWithValue("@Image", byteFile);
  cmd.ExecuteNonQuery();
}

正确存储数据后,您可以使用(byte[])dr["Image"]阅读并获取数据。

编辑:

要在字符串中生成二进制文件,需要将其格式化为二进制文字:

string bin = "0x" + BitConverter.ToString(byteFile).Replace("-", String.Empty);
string SQL = "insert into UserIcon (image) values (" + bin + ")";

答案 1 :(得分:0)

这是我使用的代码,随意使用它。它适用于sql DB。 我还不知道它是否适用于oracle数据库。

private void AddImage_Click(object sender, EventArgs e)
    {
        //select files to add, in my case images
        FileDialog Filedlg = new OpenFileDialog();
        if (filedlgdefaultpath.Equals("") | filedlgdefaultpath == null)
        {
            Filedlg.InitialDirectory = @"c:\";
        }
        else
        {   
        Filedlg.InitialDirectory = @"filedlgdefaultpath";
    }
    if (!Filedlg.CheckPathExists) Filedlg.InitialDirectory = @"c:\";

    Filedlg.Filter = "Image Files|*.bmp;*.jpg;*.gif;*.png";
    Filedlg.FilterIndex = 1;
    Filedlg.RestoreDirectory = true;
    //if files are selected add them in the database
    if (Filedlg.ShowDialog() == DialogResult.OK)
    {
        filedlgdefaultpath = Path.GetDirectoryName(Filedlg.FileName);
        string[] imagepaths = Filedlg.FileNames;
        connect.OpenConnection();
        foreach (string path in imagepaths)
        {
            writeFileToDB(connect, path);
        }
        connect.CloseConnection();
    }
    else return;

}
private void writeFileToDB( DBConnector connect, string path)
{
    byte[] byteFile = File.ReadAllBytes(path); 
    string bin = "0x" + BitConverter.ToString(byteFile).Replace("-", String.Empty);
    string SQL = @"INSERT INTO UserIcon (image) VALUES(" + bin + ")";
    connect.ExecuteNonSelectQuery(SQL);
}