我正在尝试这样做:
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"]);
}
你觉得我应该怎么做才能做到这一点?
无需告诉我“不要在数据库中放置大图像”,我的老板告诉我这样做,我们已经尝试过,这不是我的决定。
答案 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);
}