请问如何RichEditBox中的文本(有可能带格式)放入Access数据库(不是SQL)?
又如何将其取出(如果放入时有格式,取出放到RichEditBox中也要有格式。

解决方案 »

  1.   

    以下是保存到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(); 
    } } 
      

  2.   

    感谢上面热心的立冬,不过我知道这种方法可以在SQL中成功实现。
    你的代码来自CodeGuru,不过,在Access数据库中就不对了~
    你可能没试过。
      

  3.   

    上面我已经说明:以下是保存到SQL中的,适当改一下即可.我没有试过此段代码,但存到ACCESS也是可以的. 只不过是修改一下数据库连接和保存的地方.
    他们的原理都是通过保存成文件再保存到数据库中的.ACCESS中有OLE对象类型可以存储二进制数据.
      

  4.   

    我想大哥你还是试一下,肯定错误!
    我试过好几次,也是OLE对象的字段,一插入就是INSERT语句错误,
    如果像你所写的一样,程序抛出异常:肯定是UPDATE语句错误!
    希望你能试试!谢谢!
      

  5.   

    OLE对象是存放二进制数据的, 只要是文件他就能存.不管文件里存的什么数据.这一点你应该不会怀疑吧. 如果有问题你试着保存一下其他文件.网上有关于如果把文件保存到ACCESS的代码你可以找一下.如果还不行,把你的代码贴上来. 肯定是你哪里写错了.
      

  6.   

    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();
            }
    }
      

  7.   

    上面的代码总是提示: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 );
    还是不对。请指教!
      

  8.   

    先把可疑的都设为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 );
      

  9.   

    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的情况.
      

  10.   

    SQL与ACCESS一样的呀,没多大区别的。又不是做高一层的内容
      

  11.   

    SQL与ACCESS一样的呀,没多大区别的。又不是做高一层的内容
    都是这么说,就是做不对。
    谢谢各位了。
    自动增长ID不会影响的!我试过了。