RichEditBox+Access 请问如何RichEditBox中的文本(有可能带格式)放入Access数据库(不是SQL)?又如何将其取出(如果放入时有格式,取出放到RichEditBox中也要有格式。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 以下是保存到SQL中的,适当改一下即可.保存: private void btnSave_Click(object sender, System.EventArgs e) { FileStream stream = null; SqlConnection conn = null; SqlCommand cmd = null; try { richTextBox1.SaveFile( "temp.rtf" ); stream = new FileStream("temp.rtf", FileMode.Open, FileAccess.Read); int size = Convert.ToInt32(stream.Length); Byte[] rtf = new Byte[size]; stream.Read(rtf, 0, size); conn = new SqlConnection("Database=Northwind;Integrated Security=true;"); conn.Open(); cmd = new SqlCommand("UPDATE Employees SET Photo=@Photo WHERE EmployeeID=1", conn); SqlParameter paramRTF = new SqlParameter("@Photo", SqlDbType.Image, rtf.Length, ParameterDirection.Input, false, 0,0,null, DataRowVersion.Current, rtf); cmd.Parameters.Add(paramRTF); int rowsUpdated = Convert.ToInt32(cmd.ExecuteNonQuery()); MessageBox.Show(String.Format("{0} rows updated", rowsUpdated)); } catch(Exception ex) { MessageBox.Show(ex.Message); } finally { if ( stream != null ) stream.Close(); if (cmd != null ) cmd.Parameters.Clear(); if (conn != null) conn.Close(); } } 读取: private void btnLoad_Click(object sender, System.EventArgs e) { richTextBox1.Clear(); SqlConnection cn = null; SqlCommand cmd = null; SqlDataReader reader = null; try { cn = new SqlConnection("Database=Northwind;Integrated Security=true;"); cn.Open(); cmd = new SqlCommand("SELECT Photo FROM Employees WHERE EmployeeID=1", cn); reader = cmd.ExecuteReader(); reader.Read(); if (reader.HasRows) { if (!reader.IsDBNull(0)) { Byte[] rtf = new Byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))]; long bytesReceived = reader.GetBytes(0, 0, rtf, 0, rtf.Length); ASCIIEncoding encoding = new ASCIIEncoding(); richTextBox1.Rtf = encoding.GetString(rtf, 0, Convert.ToInt32(bytesReceived)); } } } catch(Exception ex) { MessageBox.Show(ex.Message); } finally { if (reader != null ) reader.Close(); if (cn != null ) cn.Close(); } } 感谢上面热心的立冬,不过我知道这种方法可以在SQL中成功实现。你的代码来自CodeGuru,不过,在Access数据库中就不对了~你可能没试过。 上面我已经说明:以下是保存到SQL中的,适当改一下即可.我没有试过此段代码,但存到ACCESS也是可以的. 只不过是修改一下数据库连接和保存的地方.他们的原理都是通过保存成文件再保存到数据库中的.ACCESS中有OLE对象类型可以存储二进制数据. 我想大哥你还是试一下,肯定错误!我试过好几次,也是OLE对象的字段,一插入就是INSERT语句错误,如果像你所写的一样,程序抛出异常:肯定是UPDATE语句错误!希望你能试试!谢谢! OLE对象是存放二进制数据的, 只要是文件他就能存.不管文件里存的什么数据.这一点你应该不会怀疑吧. 如果有问题你试着保存一下其他文件.网上有关于如果把文件保存到ACCESS的代码你可以找一下.如果还不行,把你的代码贴上来. 肯定是你哪里写错了. private void AddCurrentWord(){ FileStream stream = null; BinaryReader br = null; OleDbCommand cmd = null; try { rtBoxEditWord.SaveFile( "Temp.rtf" ); stream = new FileStream( "Temp.rtf", FileMode.Open, FileAccess.Read ); int size = Convert.ToInt32( stream.Length ); Byte[] artf = new Byte[size]; stream.Read( artf, 0, size ); cmd = new OleDbCommand(); cmd.Connection = MainForm.oleDbConn; cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES(?,?)"; OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text ); OleDbParameter paramTran = new OleDbParameter( "tran", OleDbType.Binary, artf.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, artf ); cmd.Parameters.Add( paramWord ); cmd.Parameters.Add( paramTran ); int rowsUpdated = Convert.ToInt32( cmd.ExecuteNonQuery() ); MessageBox.Show( String.Format( "{0} rows updated", rowsUpdated ) ); } catch ( Exception ex ) { MessageBox.Show( ex.Message ); } finally { if ( stream != null ) stream.Close(); if ( cmd != null ) cmd.Parameters.Clear(); }} 上面的代码总是提示:INSERT语句有误。基中Translate字段为OLE对象。如果将OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );将列为改为OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,ParameterDirection.Input, false, 0, 0, "列名", DataRowVersion.Current, txtWord.Text );还是不对。请指教! 先把可疑的都设为OleDbType.Variant试试另外你的参数名OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );改为(就是加一个@号)OleDbParameter paramWord = new OleDbParameter( "@word", OleDbType.Char, 50,ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text ); cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES(?,?)";改为cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES(@word,@translate)";也可以试试cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES('{0}','{1}')";还有考虑一下是不是还有自动增长的ID的情况. SQL与ACCESS一样的呀,没多大区别的。又不是做高一层的内容 SQL与ACCESS一样的呀,没多大区别的。又不是做高一层的内容都是这么说,就是做不对。谢谢各位了。自动增长ID不会影响的!我试过了。 c#入门经典一句话:属性可以使用virtual,override,abstract关键字,就像方法一样,什么意思? SVN在C#怎么用? WinForm的TreeView默认展开收缩按钮问题 c# 调用cmd问题 怎么实现横轴(时间轴)的无限延伸 求助!dataGridView的问题。 关于linq多表查询 如何点击datagridview显示的一行数据,显示到texebox中,然后进行修改。 Windows Forms应用程序,安装包能不能集成donnet安装包 C#导入Excel 在线等消息!~~图片取地址值是怎么做到的!~请赐教!~ [求助]谁能帮忙列一下winform下事件的列表啊
{ FileStream stream = null;
SqlConnection conn = null;
SqlCommand cmd = null;
try
{
richTextBox1.SaveFile( "temp.rtf" );
stream = new FileStream("temp.rtf", FileMode.Open, FileAccess.Read);
int size = Convert.ToInt32(stream.Length);
Byte[] rtf = new Byte[size];
stream.Read(rtf, 0, size); conn = new SqlConnection("Database=Northwind;Integrated Security=true;");
conn.Open();
cmd = new SqlCommand("UPDATE Employees SET Photo=@Photo WHERE EmployeeID=1", conn); SqlParameter paramRTF =
new SqlParameter("@Photo",
SqlDbType.Image,
rtf.Length,
ParameterDirection.Input,
false,
0,0,null,
DataRowVersion.Current,
rtf);
cmd.Parameters.Add(paramRTF); int rowsUpdated = Convert.ToInt32(cmd.ExecuteNonQuery()); MessageBox.Show(String.Format("{0} rows updated", rowsUpdated));
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if ( stream != null ) stream.Close();
if (cmd != null ) cmd.Parameters.Clear();
if (conn != null) conn.Close();
}
} 读取: private void btnLoad_Click(object sender, System.EventArgs e)
{
richTextBox1.Clear(); SqlConnection cn = null;
SqlCommand cmd = null;
SqlDataReader reader = null;
try
{
cn = new SqlConnection("Database=Northwind;Integrated Security=true;");
cn.Open();
cmd = new SqlCommand("SELECT Photo FROM Employees WHERE EmployeeID=1", cn);
reader = cmd.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
if (!reader.IsDBNull(0))
{
Byte[] rtf = new Byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))];
long bytesReceived = reader.GetBytes(0, 0, rtf, 0, rtf.Length); ASCIIEncoding encoding = new ASCIIEncoding();
richTextBox1.Rtf = encoding.GetString(rtf, 0, Convert.ToInt32(bytesReceived));
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (reader != null ) reader.Close();
if (cn != null ) cn.Close();
} }
你的代码来自CodeGuru,不过,在Access数据库中就不对了~
你可能没试过。
他们的原理都是通过保存成文件再保存到数据库中的.ACCESS中有OLE对象类型可以存储二进制数据.
我试过好几次,也是OLE对象的字段,一插入就是INSERT语句错误,
如果像你所写的一样,程序抛出异常:肯定是UPDATE语句错误!
希望你能试试!谢谢!
{
FileStream stream = null;
BinaryReader br = null;
OleDbCommand cmd = null; try
{
rtBoxEditWord.SaveFile( "Temp.rtf" );
stream = new FileStream( "Temp.rtf", FileMode.Open, FileAccess.Read ); int size = Convert.ToInt32( stream.Length );
Byte[] artf = new Byte[size];
stream.Read( artf, 0, size ); cmd = new OleDbCommand();
cmd.Connection = MainForm.oleDbConn;
cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES(?,?)"; OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );
OleDbParameter paramTran = new OleDbParameter( "tran", OleDbType.Binary, artf.Length,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, artf ); cmd.Parameters.Add( paramWord );
cmd.Parameters.Add( paramTran ); int rowsUpdated = Convert.ToInt32( cmd.ExecuteNonQuery() );
MessageBox.Show( String.Format( "{0} rows updated", rowsUpdated ) );
}
catch ( Exception ex )
{
MessageBox.Show( ex.Message );
}
finally
{
if ( stream != null ) stream.Close();
if ( cmd != null ) cmd.Parameters.Clear();
}
}
基中Translate字段为OLE对象。
如果将
OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );
将列为改为
OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,
ParameterDirection.Input, false, 0, 0, "列名", DataRowVersion.Current, txtWord.Text );
还是不对。请指教!
另外你的参数名
OleDbParameter paramWord = new OleDbParameter( "word", OleDbType.Char, 50,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );
改为(就是加一个@号)
OleDbParameter paramWord = new OleDbParameter( "@word", OleDbType.Char, 50,
ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, txtWord.Text );
改为
cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES(@word,@translate)";也可以试试
cmd.CommandText = "INSERT INTO Words(Word,Translate) VALUES('{0}','{1}')";还有考虑一下是不是还有自动增长的ID的情况.
都是这么说,就是做不对。
谢谢各位了。
自动增长ID不会影响的!我试过了。