最近给公司开发动态报表程序,通过报表设计器编辑好的模板首先以文件的形式保存,普遍的方法是把模板文件保存到硬盘的某个文件夹下面,然后数据库就保存该模板文件的存放路径即可,可以说这种方法经济实惠,但是要适应灵活多变的报表环境,尤其是可供他人共享别人已经编辑好的报表模板,这就成了问题,有没有更好的解决方案呢?那就是把模板存放到数据库里面,一切就OK了,下面给出具体的程序代码:
第一步:在Oracle数据库新建一张表,SQL语句如下
create table Test
(
ID Number primary key,
TxtFile blob
)
最好通过PL/SQL工具执行SQL语句,建好这张测试表,下面就通过C#具体实现文件的存储了
第二步:VS2008新建一个Windows应用程序,解决方案名:“保存文件到Oracle数据库”,项目名:“SaveFileToOracle”
编写代码之前,首先引入必要的命名空间,本程序要另外引入两个命名空间:using System.Data.OracleClient;
和using System.IO;
先看一下截图:
说明:窗体中央是一个RichTextBox控件,其他不用介绍了,下面是完整的程序代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OracleClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace 文件保存到数据库
{
public partial class Form1 : Form
{
private string connectionstring = @"server=CW;user id=ls0019999;password=aaaaaa;";
public Form1()
{
InitializeComponent();
this.button1.Click += new EventHandler(button1_Click);
this.button2.Click += new EventHandler(button2_Click);
this.button3.Click += new EventHandler(button3_Click);
this.button4.Click += new EventHandler(button4_Click);
this.button5.Click += new EventHandler(button5_Click);
this.button6.Click += new EventHandler(button6_Click);
this.button7.Click += new EventHandler(button7_Click);
}
void button7_Click(object sender, EventArgs e)
{
StringWriteDB(this.textBox1.Text.Trim());
}
void button6_Click(object sender, EventArgs e)
{
StringAndWrite(this.textBox1.Text.Trim(), this.textBox2.Text.Trim());
}
void button5_Click(object sender, EventArgs e)
{
StringAndRead(this.textBox1.Text.Trim());
}
void button1_Click(object sender, EventArgs e)
{
newFile();
}
void button4_Click(object sender, EventArgs e)
{
deleteFile(this.textBox1.Text.Trim());
}
void button3_Click(object sender, EventArgs e)
{
CreateNewFile();
}
void button2_Click(object sender, EventArgs e)
{
SaveFile(this.textBox2.Text.Trim());
}
private void SaveFile(string fileIndex)
{
FileStream fileStream = new FileStream(Application.StartupPath + "\\" + fileIndex, FileMode.Open, FileAccess.Read);
BinaryReader filerd = new BinaryReader(fileStream, Encoding.Default);
byte[] fileByte = new byte[fileStream.Length];
filerd.Read(fileByte, 0, (int)fileStream.Length);
OracleConnection con = new OracleConnection(connectionstring);
try
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "insert into test (ID,TXTFILE) values(:ID,:TXTFILE)";
cmd.Parameters.AddWithValue(":ID", this.textBox1.Text.Trim());
cmd.Parameters.AddWithValue(":TXTFILE", DBNull.Value);
cmd.Parameters[":TXTFILE"].Value = fileByte;
cmd.ExecuteNonQuery();
MessageBox.Show("把文件写入数据库成功!");
}
catch (Exception ex)
{
MessageBox.Show("错误提示:" + ex.StackTrace);
}
}
private void ReadFile()
{
OracleConnection con = new OracleConnection(connectionstring);
try
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "select * from test";
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
byte[] fileByte = (byte[])ds.Tables[0].Rows[i]["TXTFILE"];
this.richTextBox1.AppendText(Encoding.Default.GetString(fileByte));
}
}
}
catch (Exception ex)
{
MessageBox.Show("错误提示:" + ex.StackTrace);
MessageBox.Show("错误原因:" + ex.Message.ToString());
}
}
private void CreateNewFile()
{
this.richTextBox1.Clear();
using (OracleConnection con = new OracleConnection(connectionstring))
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "select * from test";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
byte[] fileByte = (byte[])reader.GetValue(1);
this.richTextBox1.AppendText("[" + reader.GetInt32(0).ToString() + "]" + ":" + Encoding.Default.GetString(fileByte));
this.richTextBox1.AppendText("\n");
}
}
}
private void deleteFile(string index)
{
using (OracleConnection con = new OracleConnection(connectionstring))
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "delete from test where ID=" + int.Parse(index);
cmd.ExecuteNonQuery();
MessageBox.Show("删除成功!");
}
}
private void newFile()
{
this.richTextBox1.Clear();
using (OracleConnection con = new OracleConnection(connectionstring))
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "select * from test";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
byte[] fileByte = (byte[])reader.GetValue(1);
FileStream fileStream = new FileStream(Application.StartupPath + "\\" + "QQ.grf", FileMode.Create);
fileStream.Write(fileByte, 0, (int)fileStream.Length);
this.richTextBox1.AppendText("[" + reader.GetInt32(0).ToString() + "]" + ":" + Encoding.Default.GetString(fileByte));
this.richTextBox1.AppendText("\n");
}
}
}
private void StringAndRead(string fileName)
{
//FileInfo myFile = new FileInfo(Application.StartupPath + "\\" + fileName);
//StreamReader sr = myFile.OpenText();
StreamReader sr = new StreamReader(Application.StartupPath + "\\" + fileName, Encoding.Default);
MessageBox.Show(sr.CurrentEncoding.EncodingName);
this.richTextBox1.Text = sr.ReadToEnd();
sr.Close();
}
private void StringAndWrite(string fromName, string toName)
{
StreamReader sr = new StreamReader(Application.StartupPath + "\\" + fromName, Encoding.Default);
StreamWriter sw = new StreamWriter(Application.StartupPath + "\\" + toName, true, Encoding.Default);
sw.Write(sr.ReadToEnd());
sr.Close();
sw.Close();
}
private void StringWriteDB(string fileName)
{
this.richTextBox1.Clear();
using (OracleConnection con = new OracleConnection(connectionstring))
{
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "select * from test";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
byte[] fileByte = (byte[])reader.GetValue(1);
StreamWriter sw = new StreamWriter(Application.StartupPath + "\\" + fileName, true, Encoding.Default);
sw.Write(fileByte);
sw.Close();
StreamReader sr = new StreamReader(Application.StartupPath + "\\" + fileName, Encoding.Default);
this.richTextBox1.Text = sr.ReadToEnd();
sr.Close();
}
}
}
}
}
最后说明:本小程序Demo在VS2008集成环境下编译通过,最好能完整的自己去编写一边,另外补充一下“流”的概念,就可以很简单的实现文件保存数据库,以及怎样从数据库读和写文件。