Oracle存取文件(C++/CLI)

namespace Oracle存取文件 {
          using namespace System::Data::OleDb;
          using namespace System::IO;
          System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e)
         {
              //连接字符串
              String^ FileName = "E:\\Test1.txt";
              String^ conn_str = "Provider=OraOLEDB.Oracle.1;Password=test;Persist Security Info=TRUE;USER ID=sa;" + "Data Source=Insight";

              OleDbConnection^ cn = gcnew OleDbConnection(conn_str);      //创建连接对象
              cn->Open();

             OleDbCommand^ cmd = gcnew OleDbCommand("UPDATE BLOB SET FILECONTENT = ? ",cn);//更新命令
              cmd->Parameters->Add("FILECONTENT", OleDbType::Binary);

             //文件流句柄
             FileStream^ fs = gcnew FileStream(FileName, FileMode::OpenOrCreate, FileAccess::Read);
             array<Byte>^ MyData = gcnew array<Byte>(System::Convert::ToInt32(fs->Length));

            //将文件内容保存到字节数组
            fs->Read(MyData, 0, System::Convert::ToInt32(fs->Length));
           fs->Close();

           cmd->Parameters["FILECONTENT"]->Value = MyData;
           try
          {
                int result = cmd->ExecuteNonQuery();
               if (result < 1)  //如果数据库中没有,则进行插入
               {
                    OleDbCommand^ cmd1 = gcnew OleDbCommand("INSERT INTO BLOB (FILECONTENT) VALUES(?)", cn);
                    cmd1->Parameters->Add("FILECONTENT", OleDbType::Binary);
                    cmd1->Parameters["FILECONTENT"]->Value = MyData;
                    cmd1->ExecuteNonQuery();
               }
           }
           catch(Exception^ e1)
          {
               MessageBox::Show(e1->Message);
          }
           finally
          {
              cn->Close();
               MessageBox::Show("文件已经成功存入数据库");
           }
      }

       System::Void Form1::button2_Click(System::Object^  sender, System::EventArgs^  e)
      {
          //连接字符串
          String ^conn_str = "Provider=OraOLEDB.Oracle.1;Password=test;Persist Security Info=TRUE;USER ID=sa;"
             + "Data Source=Insight";

          OleDbConnection^ conn = gcnew OleDbConnection(conn_str);
          OleDbCommand ^cmd = gcnew OleDbCommand("SELECT FILECONTENT FROM BLOB", conn);
          conn->Open();   //打开数据库


            FileStream^ fs;                         //文件流句柄
            BinaryWriter^ bw;                        //将BLOB类型转换为二进制流
            int bufferSize = 100;                   //字节数组大小.
            array<Byte>^outbyte = gcnew array<Byte>(bufferSize);  //字节数组
            long retval;                            //返回的字节数
            long startIndex = 0;                    //从BLOB读取的开始位置


            //CommandBehavior.SequentialAccess提供一种方法,
            //以便 DataReader 处理包含带有大二进制值的列的行
           OleDbDataReader^ myReader = cmd->ExecuteReader();

           bool Check = false;
           while (myReader->Read())
          {
               Check = true;
               fs = gcnew FileStream("E:\\TestAgain1.txt",
               FileMode::OpenOrCreate, FileAccess::Write);

              //将文件流转换为二进制字节流
              bw = gcnew BinaryWriter(fs);

            //从索引0再开始
              startIndex = 0;

            //返回字节个数
             retval = myReader->GetBytes(0, startIndex, outbyte, 0, bufferSize);

            //写入文件
            while (retval == bufferSize)
             {
                 bw->Write(outbyte);

                //清理当前编写器的所有缓冲区
                bw->Flush();

                startIndex += bufferSize;
                retval = myReader->GetBytes(0, startIndex, outbyte, 0, bufferSize);
            }

             bw->Write(outbyte, 0, (int)retval);
             bw->Flush();

             bw->Close();
            fs->Close();
        }
       if (Check != true)
       {
           MessageBox::Show("数据库中没有该文件!");
        }
        else
       {
            MessageBox::Show("文件已成功读取并保存!");
        }
        myReader->Close();
        conn->Close();
     }
}

转载于:https://www.cnblogs.com/wutaozhao/archive/2008/07/30/1256101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值