1、ORACLE 数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)这里我用的是 ORACLE9I, 建立了表 C_EMP1_T,结构如下:create table C_EMP1_T(EMP_ID NUMBER(20) not null, /用户 IDEMP_NO VARCHAR2(20), /用户编号EMP_DESC LONG, /用户简历 USED_DATE DATE, /注册日期EMP_IC_MAC RAW(50), /用户 IC 卡的 MAC 号EMP_ADMIN_FLAG CHAR(1), /管理员标志EMP_PICTURE BLOB /用户图像)其中 INSERT/UP
2、DATE/SELECT 的代码分别如下(DELETE 比较简单就省略了,其中SELECT 和 UPDATE 的条件都是记录的 rowid):首先 BLOB 字段是存图片的,所以有一个过程是把图片传到服务器上:先在 aspx 上加:下一步和代码:private void btunload_Click(object sender, System.EventArgs e)btunload.Enabled = false;/获得文件名称 string tempfilename = IoFile.PostedFile.FileName;/注: loFile.PostedFile.FileName 返回的
3、是 通过文件对话框选择的文件名,这之中包含了文件的目录信息tempfilename = Path.GetFileName ( tempfilename);if (tempfilename.Substring(tempfilename.Length-4,4) = “.bmp“)/去掉目录信息,返回文件名称/判断上传目录是否存在,不存在就建立 string tempDirectory = “D:/WWWROOT/MYWEB/dbtest/Image/“;if ( ! Directory.Exists ( tempDirectory ) ) Directory.CreateDirectory ( t
4、empDirectory ) ;/上传文件到服务器 string tempPath = tempDirectory+tempfilename;/得到上传目录及文件名称 IoFile.PostedFile.SaveAs ( tempPath );Label1.Text = “;Session“filename“ = tempfilename;elseLabel1.Text = “错误的文件类型“;btunload.Enabled = true;/* 获得并显示上传文件的属性 FileName.Text = lstrFileName 获得文件名称FileType.Text = loFile.Pos
5、tedFile.ContentType 获得文件类型FileLength.Text = cStr ( loFile.PostedFile.ContentLength ) 获得文件长度FileUploadForm.visible = false AnswerMsg.visible = true 显示上传文件属性End sub */INSERT:private void BtInsert_Click(object sender, System.EventArgs e)OracleConnection Ocon = new OracleConnection(“user id=cmes;data so
6、urce=mes;password=cmes“);Ocon.Open(); /OracleCommand Ocom = new OracleCommand(“insert into c_emp1_t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLAG,EMP_PICTURE)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_mac,:flag,:picture)“,Ocon);OracleCommand Ocom = new OracleCommand(“insert int
7、o c_emp1_t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLAG)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_mac,:flag)“,Ocon);Ocom.Parameters.Add(new OracleParameter(“emp_id“,OracleType.Number);Ocom.Parameters.Add(new OracleParameter(“emp_no“,OracleType.VarChar);Ocom.Parameters.Add(new
8、 OracleParameter(“emp_desc“,OracleType.LongVarChar);Ocom.Parameters.Add(new OracleParameter(“emp_date“,OracleType.DateTime);Ocom.Parameters.Add(new OracleParameter(“flag“,OracleType.Char);Ocom.Parameters.Add(new OracleParameter(“emp_ic_mac“,OracleType.Raw);/Ocom.Parameters.Add(new OracleParameter(“p
9、icture“,OracleType.Blob);Ocom.Parameters“emp_id“.Value = Convert.ToDecimal(tbempid.Text);Ocom.Parameters“emp_no“.Value = tbempno.Text;Ocom.Parameters“emp_desc“.Value = tbempdesc.Text;string empdate = tbempdate.Text;/ yyyymmddOcom.Parameters“emp_date“.Value = new DateTime(Convert.ToInt32(empdate.Subs
10、tring(0,4),Convert.ToInt32(empdate.Substring(4,2),Convert.ToInt32(empdate.Substring(6,2) );if (rb1.Checked) Ocom.Parameters“flag“.Value = 1;if (rb2.Checked) Ocom.Parameters“flag“.Value = 2;if (rb3.Checked) Ocom.Parameters“flag“.Value = 3;Ocom.Parameters“emp_ic_mac“.Value = setraw(tbicmac.Text); Ocom
11、.ExecuteNonQuery();/*由与有字段 long 和 blob 一起,所以不能在一个 insert 语句中进行插入,单独 insert 是成功的OracleConnection Ocon = new OracleConnection(“user id=cmes;data source=mes;password=cmes“);Ocon.Open(); OracleCommand Ocom = new OracleCommand(“insert into c_emp1_t (EMP_ID,EMP_PICTURE)values(:emp_id,:picture)“,Ocon);Ocom
12、.Parameters.Add(new OracleParameter(“emp_id“,OracleType.Number);Ocom.Parameters.Add(new OracleParameter(“picture“,OracleType.Blob);Ocom.Parameters“emp_id“.Value = Convert.ToDecimal(tbempid.Text);FileStream reader = new FileStream(“D:/WWWROOT/MYWEB/dbtest/Image/002.bmp“,FileMode.Open);/在 iis 中不用用 “”目
13、录结构应该是“/”byte tempimage = new bytereader.Length;reader.Read(tempimage,0,tempimage.Length);/OracleLob tempLob=OracleLob.Null;/tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);/tempLob.Write(tempimage,0,tempimage.Length);/tempLob.EndBatch();reader.Close();Ocom.Parameters“picture“.Size = tempimage.Lengt
14、h;/tempimage.CopyTo(Ocom.Parameters“picture“.Value,0);Ocom.Parameters“picture“.Value = tempimage;Ocom.ExecuteNonQuery();*/string myfilename = Convert.ToString(Session“filename“);if (myfilename != “)Ocom.Parameters.Clear();Ocom.CommandText = “update c_emp1_t SET EMP_PICTURE = :PICTURE WHERE EMP_ID= :
15、EMP_ID “;Ocom.Parameters.Add(new OracleParameter(“EMP_ID“,OracleType.Number);Ocom.Parameters.Add(new OracleParameter(“PICTURE“,OracleType.Blob);Ocom.Parameters“EMP_ID“.Value = Convert.ToDecimal(tbempid.Text);FileStream reader = new FileStream(“D:/WWWROOT/MYWEB/dbtest/Image/“+myfilename,FileMode.Open
16、);/在 iis 中不用用“” 目录结构应该是“/”byte tempimage = new bytereader.Length;reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters“PICTURE“.Size = tempimage.Length;Ocom.Parameters“PICTURE“.Value = tempimage;Ocom.ExecuteNonQuery();Session“filename“ = “;Ocon.Close();UPDATE:private void btUpdate
17、_Click(object sender, System.EventArgs e)OracleConnection Ocon = new OracleConnection(“user id=cmes;data source=mes;password=cmes“);Ocon.Open(); OracleCommand Ocom = new OracleCommand(“UPDATE c_emp1_t SET EMP_ID= :emp_id,EMP_NO= :emp_no,EMP_DESC= :emp_desc,USED_DATE= :emp_date,EMP_IC_MAC= :emp_ic_ma
18、c,EMP_ADMIN_FLAG= :flag WHERE ROWID = :MYROWID“,Ocon);Ocom.Parameters.Add(new OracleParameter(“MYROWID“,OracleType.RowId);Ocom.Parameters.Add(new OracleParameter(“emp_id“,OracleType.Number);Ocom.Parameters.Add(new OracleParameter(“emp_no“,OracleType.VarChar);Ocom.Parameters.Add(new OracleParameter(“
19、emp_desc“,OracleType.LongVarChar);Ocom.Parameters.Add(new OracleParameter(“emp_date“,OracleType.DateTime);Ocom.Parameters.Add(new OracleParameter(“flag“,OracleType.Char);Ocom.Parameters.Add(new OracleParameter(“emp_ic_mac“,OracleType.Raw);Ocom.Parameters“MYROWID“.Value = TBROWID.Text;Ocom.Parameters
20、“emp_id“.Value = Convert.ToDecimal(tbempid.Text);Ocom.Parameters“emp_no“.Value = tbempno.Text;Ocom.Parameters“emp_desc“.Value = tbempdesc.Text;string empdate = tbempdate.Text;/ yyyymmddOcom.Parameters“emp_date“.Value = new DateTime(Convert.ToInt32(empdate.Substring(0,4),Convert.ToInt32(empdate.Subst
21、ring(4,2),Convert.ToInt32(empdate.Substring(6,2) );if (rb1.Checked) Ocom.Parameters“flag“.Value = 1;if (rb2.Checked) Ocom.Parameters“flag“.Value = 2;if (rb3.Checked) Ocom.Parameters“flag“.Value = 3;Ocom.Parameters“emp_ic_mac“.Value = setraw(tbicmac.Text); Ocom.ExecuteNonQuery();string myfilename = C
22、onvert.ToString(Session“filename“);if (myfilename != “)Ocom.Parameters.Clear();Ocom.CommandText = “update c_emp1_t SET EMP_PICTURE = :PICTURE WHERE EMP_ID= :EMP_ID “;Ocom.Parameters.Add(new OracleParameter(“EMP_ID“,OracleType.Number);Ocom.Parameters.Add(new OracleParameter(“PICTURE“,OracleType.Blob)
23、;Ocom.Parameters“EMP_ID“.Value = Convert.ToDecimal(tbempid.Text);FileStream reader = new FileStream(“D:/WWWROOT/MYWEB/dbtest/Image/“+myfilename,FileMode.Open);/在 iis 中不用用“” 目录结构应该是“/”byte tempimage = new bytereader.Length;reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters“PICTU
24、RE“.Size = tempimage.Length;Ocom.Parameters“PICTURE“.Value = tempimage;Ocom.ExecuteNonQuery();Session“filename“ = “;Ocon.Close();SELECT(由于图片是直接向客户端输出,所以需要另一个页面来输入图片):private void btselect_Click(object sender, System.EventArgs e)if (TBROWID.Text.Length “;reader.Close();Ocon.Close();webform3.aspx 的程序:
25、private void Page_Load(object sender, System.EventArgs e)OracleConnection Ocon = new OracleConnection(“user id=cmes;data source=mes;password=cmes“);Ocon.Open(); OracleCommand Ocom = new OracleCommand(“select EMP_PICTURE from c_emp1_t where rowid = :emprowid“,Ocon);Ocom.Parameters.Add(new OracleParam
26、eter(“emprowid“,OracleType.RowId);Ocom.Parameters“emprowid“.Value = Request.Params“ROWID“;OracleDataReader reader = Ocom.ExecuteReader();while (reader.Read()if (!(reader.IsDBNull(0)OracleLob tempBlob = reader.GetOracleLob(0);byte tempbuffer = new bytetempBlob.Length;/tempBlob.BeginBatch(OracleLobOpe
27、nMode.ReadWrite);会有错误 ORA-22292: 无法在没有事务处理的情况下以读写模式打开 LOB tempBlob.BeginBatch();tempBlob.Read(tempbuffer,0,tempbuffer.Length);tempBlob.EndBatch();/下面是把具体的文件保存出来BinaryWriter writer = new BinaryWriter(new FileStream(“D:/WWWROOT/MYWEB/dbtest/Image/temp.bmp“,FileMode.Create);for(int i=0;itempbuffer.Length;i+)writer.Write(tempbufferi);writer.Close();/下面是直接把图片用流向客户端输出Response.BinaryWrite(tempbuffer);reader.Close();Ocon.Close();这些代码在 2000 下测试通过的,初次写代码有些凌乱,请大家多多提意见