C#如何更新MySQL的BLOB字段
我找到一些代码,但不好用,不懂C#,所以来这里请教大家了!
- C# code
SqlConnection conn =null; SqlCommand cmd = null; SqlParameter param = null; FileStream fs = null; const string sConn = "server=(local);Initial Catalog=Northwind;UID=ctester;PWD=password"; try { conn = new SqlConnection(sConn); cmd = new SqlCommand("UPDATE Categories SET Picture = ?Picture WHERE CategoryName = 'Seafood'", conn); fs = new FileStream("c:\\Builder.doc", FileMode.Open, FileAccess.Read); Byte[] blob = new Byte[fs.Length]; fs.Read(blob, 0, blob.Length); fs.Close(); param = new SqlParameter("Picture", SqlDbType.VarBinary, blob.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, blob); cmd.Parameters.Add(param); conn.Open(); cmd.ExecuteNonQuery(); } catch (SqlException e){ Console.Write("SQL Exception: " + e.Message()); } catch (Exception e) { Console.Write("Exception: " e.Message()); }
实际上,就是如何将一个 byte[] 更新到mysql的BLOB上面,不是Insert 是 update 操作!
[解决办法]
- C# code
cmd = new SqlCommand("UPDATE Categories SET Picture =@Picture Picture WHEREnew SqlParameter("Picture", byte[])
[解决办法]
SqlConnection conn =null;//连接字符串来用的
SqlCommand cmd = null; //执行SQL语句
SqlParameter param = null;//传参数来用的
FileStream fs = null;//文件流
const string sConn = "server=(local);Initial
Catalog=Northwind;UID=ctester;PWD=password";//SQL的连接字符串
try {
conn = new SqlConnection(sConn);//实利化连接字符串
cmd = new SqlCommand("UPDATE Categories SET Picture = ?Picture WHERE
CategoryName = 'Seafood'", conn);//SQL语句
fs = new FileStream("c:\\Builder.doc", FileMode.Open, FileAccess.Read);//用文件流读取c:\\Builder.doc
Byte[] blob = new Byte[fs.Length];//一个Byte数组
fs.Read(blob, 0, blob.Length);//读取文件流
fs.Close();//关闭文件流
param = new SqlParameter("Picture", SqlDbType.VarBinary, blob.Length,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, blob);//传入的参数
cmd.Parameters.Add(param);//添加到数据库里面
conn.Open();//关闭数据库连接
cmd.ExecuteNonQuery();//反回受影响行数
} catch (SqlException e){
Console.Write("SQL Exception: " + e.Message());//异常
} catch (Exception e) {
Console.Write("Exception: " e.Message());//异常
}
[解决办法]
MySQL/MSSQL?
如果文件比较大的话,需要循环读取文件内容,。
MSSQL下面是:
UPDATETEXT { table_name.dest_column_name dest_text_ptr }
{ NULL | insert_offset }
{ NULL | delete_length }
[ WITH LOG ]
[ inserted_data
| { table_name.src_column_name src_text_ptr } ]
如果2005等较新的版本,用write 子 句的update.
USE AdventureWorks;
GO
DECLARE @MyTableVar table (
DocumentID int NOT NULL,
SummaryBefore nvarchar(max),
SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT INSERTED.DocumentID,
DELETED.DocumentSummary,
INSERTED.DocumentSummary
INTO @MyTableVar
WHERE DocumentID = 3 ;
SELECT DocumentID, SummaryBefore, SummaryAfter
FROM @MyTableVar;
GO
[解决办法]
如果数据库是Mysql的话,连接不能用sqlconnection了,可能是oledbconnection类别,或者专门为Mysql开发的ADO.Net库。
[解决办法]
- C# code
OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["NEWOracleConn"].ToString()); OracleCommand cmd = new OracleCommand("UPDATE TUSER SET PHOTO=:photo WHERE userid=:id", conn); Console.WriteLine(cmd.CommandText); cmd.Parameters.Add("photo",OracleType.Blob); cmd.Parameters["photo"].Value = photo; cmd.Parameters.Add("id", OracleType.Number); cmd.Parameters["id"].Value = id; conn.Open(); cmd.ExecuteNonQuery(); conn.Close();
[解决办法]
MySql.Data.MySqlClient.MySqlCommand cmm = null;
cmm = new MySql.Data.MySqlClient.MySqlCommand("", connect);
MySql.Data.MySqlClient.MySqlParameter param = null;
param = new MySql.Data.MySqlClient.MySqlParameter("?Picture", System.Data.DbType.Binary);
param.Value = System.Text.Encoding.Default.GetBytes("");
cmm.Parameters.Add(param);
cmm.ExecuteNonQuery();
[解决办法]
使用 SUN的 System.Data.MySqlClient 这个 数据接口调用的吧
这个和 System.Data.SqlClient 什么都一样.
估计 System.Data.MySqlClient 已经自动帮我们把byte[] 转换了
不过没试过.楼主好运
.
[解决办法]
用MySQL的dll啊,很好用,很简单!!
http://dev.mysql.com/downloads/connector/net/6.1.html
[解决办法]
我在C++CLI 中用过,和C#仅仅表现形式稍有差别,你很容易看懂。自己加上try catch
直接用OdbcConnection 用其它上层数据库连接类的也有,如果需要可以给你。
int UpdateBlob(OdbcConnection^ m_dbConn, String^ FileName,int docID)
{
//you should put following code into try catch
//support you have a table with 2 columns: docID and imgfile
//read image file
FileStream^ fs = gcnew FileStream(FileName, FileMode::Open, FileAccess::Read);
int FileSize = (int)fs->Length;
array<Byte>^ rawData = gcnew array<Byte>(FileSize);
fs->Read(rawData, 0, FileSize);
fs->Close();
//make sql
String^ sql = String::Format("UPDATE table1 VALUES({0},?)",docID);
OdbcCommand^ cmd = gcnew OdbcCommand(sql,m_dbConn);
cmd->Parameters->Add("imgfile",OdbcType::Binary,FileSize,"imgfile")->Value = rawData;
//do update now
ret = cmd->ExecuteNonQuery();
return ret;
}
[解决办法]
http://blog.csdn.net/sciland/archive/2009/03/25/4023679.aspx
我以前在c#中连接过MySQL,上面的链接有介绍;像 string sql = "update table_name set col_name='" + values + "'where col2='" + values2 + "'";完成后就执行 RunSqlDatacmd(sql)就好了,RunSqlDatacmd(sql)代码如下:
public static long RunSqlDatacmd(string sql) //sql语句执行成员
{
MySqlConnection dbconn = new MySqlConnection("Database='Online';Data Source='localhost';User Id='root';Password='123456';charset=utf8");
MySqlCommand cmd = dbconn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
long ret = 0;
try
{
if (cmd.Connection.State == ConnectionState.Broken)
{
cmd.Connection.Close();
cmd.Connection.Open();
}
else if (cmd.Connection.State == ConnectionState.Closed)
{
cmd.Connection.Open();
}
// else if (cmd.Connection.State == ConnectionState.Open)
// {
ret = cmd.ExecuteNonQuery();
// }
//else
// {
// ret = -102;
// }
}
catch (Exception ex)
{
string m = ex.Message;
ret = -5;
}
cmd.Dispose();
dbconn.Close();
return ret;
}
}
}