ORACLE數據庫中主要字段類型的讀寫例子(包括:Long、Raw、Blob)


這里我用的是ORACLE9I, 建立了表C_EMP1_T,結構如下:
create table C_EMP1_T
(
  EMP_ID         NUMBER(20) not null,    //用戶ID
  EMP_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/UPDATE/SELECT的代碼分別如下(DELETE比較簡單就省略了,其中SELECT和UPDATE的條件都是記錄的rowid):
首先BLOB字段是存圖片的,所以有一個過程是把圖片傳到服務器上:
    先在aspx上加:
<form id="Form1" enctype="multipart/form-data" method="post" runat="server">
    <input id="IoFile" runat="server" type="file"> <FONT face="宋體">下一步→</FONT>
       <asp:Button id="btunload" runat="server" Text="上傳"></asp:Button>
</form>
和代碼:

     private   void  btunload_Click( object  sender, System.EventArgs e)
        
{
            
            btunload.Enabled 
= false;
            
//獲得文件名稱 
            
          
string tempfilename = IoFile.PostedFile.FileName;
           
//注: loFile.PostedFile.FileName 返回的是 通過文件對話框選擇的文件名,這之中包含了文件的目錄信息
          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 ( tempDirectory ) ;
          
//上傳文件到服務器 
                string tempPath = tempDirectory+tempfilename;//得到上傳目錄及文件名稱 
                IoFile.PostedFile.SaveAs ( tempPath );
                Label1.Text 
= "<img src='image/"+tempfilename+"'>";
                Session[
"filename"= tempfilename;
            }

            
else
            
{
                Label1.Text 
= "錯誤的文件類型";
            }

            btunload.Enabled  
= true;
            
/*  
   ' 獲得並顯示上傳文件的屬性 
  FileName.Text = lstrFileName
   ' 獲得文件名稱
  FileType.Text = loFile.PostedFile.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 source=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 into 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 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("picture",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;// yyyymmdd
            Ocom.Parameters["emp_date"].Value =    new DateTime(Convert.ToInt32(empdate.Substring(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.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.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中不用用“\”目錄結構應該是“/”
            byte[] tempimage = new byte[reader.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.Length;
            //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= :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);//在iis中不用用“\”目錄結構應該是“/”
                byte[] tempimage = new byte[reader.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_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_mac,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("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[
"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;// yyyymmdd
            Ocom.Parameters["emp_date"].Value =    new DateTime(Convert.ToInt32(empdate.Substring(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.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= :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);//在iis中不用用“\”目錄結構應該是“/”
                byte[] tempimage = new byte[reader.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();


        }
SELECT(由於圖片是直接向客戶端輸出,所以需要另一個頁面來輸入圖片):
private   void  btselect_Click( object  sender, System.EventArgs e)
        
{
            
if (TBROWID.Text.Length < 18)
            
{
                TBROWID.Text 
= "請輸入正確的ROWID";
                
return;
                
            }

            OracleConnection Ocon 
= new  OracleConnection("user id=cmes;data source=mes;password=cmes");
            Ocon.Open(); 
            OracleCommand Ocom 
= new OracleCommand("select EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLAG,EMP_PICTURE from c_emp1_t where rowid = :emprowid",Ocon);
            Ocom.Parameters.Add(
new OracleParameter("emprowid",OracleType.RowId));
            Ocom.Parameters[
"emprowid"].Value = TBROWID.Text;
            OracleDataReader reader 
= Ocom.ExecuteReader();
            
while (reader.Read())
            
{
                
if (!(reader.IsDBNull(0)))
                tbempid.Text 
= Convert.ToString( reader.GetDecimal(0));
                
if (!(reader.IsDBNull(1)))
                tbempno.Text 
= reader.GetString(1);
                
if (!(reader.IsDBNull(2)))
                tbempdesc.Text 
= reader.GetString(2);
                
if (!(reader.IsDBNull(3)))
                
{
                    DateTime DT 
= reader.GetDateTime(3);
                    tbempdate.Text 
= DT.ToString("yyyyMMdd");
                }

                
                
                
if (!(reader.IsDBNull(4)))
                
{
                    
                    
byte[] temp = new byte[4000];
                    reader.GetBytes(
4,0,temp,0,4000);
                    tbicmac.Text 
= getraw(temp);
                }

                
else
                    tbicmac.Text 
= "";

                
if (!(reader.IsDBNull(5)))
                
{
                    
/*char tempflag = reader.GetChar(5);  //不支持此方法
                    switch (tempflag)
                    {
                        case '1':
                            rb1.Checked = true;break;
                        case '2':
                            rb2.Checked = true;break;
                        default :
                            rb3.Checked = true;break;

                    }
*/

                    
char tempflag = Convert.ToChar(reader.GetValue(5));
                    
switch (tempflag)
                    
{
                        
case '1':
                            rb1.Checked 
= true;break;
                        
case '2':
                            rb2.Checked 
= true;break;
                        
default :
                            rb3.Checked 
= true;break;

                    }



                    

                }

                
if (!(reader.IsDBNull(6)))
                
{
        
                    Label1.Text 
= "<img src='webform3.aspx?ROWID="+TBROWID.Text+"'>";
                
                }

            }

            reader.Close();
            Ocon.Close();
            



        }

webform3.aspx的程序:
         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 OracleParameter("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 byte[tempBlob.Length];
                    
//tempBlob.BeginBatch(OracleLobOpenMode.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;i<tempbuffer.Length;i++)
                    
{
                        writer.Write(tempbuffer[i]);
                    }

                    writer.Close();
                    
//下面是直接把圖片用流向客戶端輸出
                    Response.BinaryWrite(tempbuffer);
                    
                }

            }

            reader.Close();
            Ocon.Close();
        }
這些代碼在2000下測試通過的,初次寫代碼有些凌亂,請大家多多提意見

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com