根据数据库类型,取出数据或者是插入数据
DBAccess.cs
namespace FactoryMethod { public abstract class DBAccess { abstract public DataTable GetData(); abstract public DataTable SetData(string left, string oper, string right); } public class SqlServer : DBAccess// SQL Server,继承自DBAccess类 { string connectionString = string.Empty; SqlConnection connection = null; SqlCommand cmd = null; SqlDataAdapter dap = null; DataTable table = null; public override DataTable GetData()//读取SQL Server数据库 { try { connectionString = "Data Source=.;Initial Catalog=Calculator;Integrated Security=True;Pooling=False"; connection = new SqlConnection(connectionString); cmd = new SqlCommand("select txtLeft,txtOper,txtRight from Question", connection); dap = new SqlDataAdapter(cmd); table = new DataTable(); dap.Fill(table); return table; } catch { return null; } finally { table.Dispose(); } } public override DataTable SetData(string left,string oper,string right) //向SQL Server数据库表中插入记录 { connectionString = "Data Source=.;Initial Catalog=Calculator;Integrated Security=True;Pooling=False"; connection = new SqlConnection(connectionString); string insertInfo = "insert into Question(txtLeft,txtOper,txtRight) values('" + left + "','" + oper + "','" + right + "')"; SqlCommand sqlcmd = new SqlCommand(insertInfo, connection); connection.Open(); try { sqlcmd.ExecuteNonQuery(); } catch { return null; } connection.Close(); return null; } } public class Access : DBAccess//Access,继承自DBAccess类 { string connectionString = string.Empty; OleDbConnection connection = null; OleDbCommand cmd = null; OleDbDataAdapter dap = null; DataTable table = null; public override DataTable GetData()//读取Access数据库 { try { connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Calculator.mdb"; connection = new OleDbConnection(connectionString); cmd = new OleDbCommand("select txtLeft,txtOper,txtRight from Question", connection); dap = new OleDbDataAdapter(cmd); table = new DataTable(); dap.Fill(table); return table; } catch { return null; } finally { table.Dispose(); } } public override DataTable SetData(string left, string oper, string right) //向Access数据库表中插入记录 { connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Calculator.mdb"; connection = new OleDbConnection(connectionString); string insertInfo = "insert into Question(txtLeft,txtOper,txtRight) values('" + left + "','" + oper + "','" + right + "')"; OleDbCommand OleDbcmd = new OleDbCommand(insertInfo, connection); connection.Open(); try { OleDbcmd.ExecuteNonQuery(); } catch { return null; } connection.Close(); return null; } } }
抽象工厂类
CreateDBFactory.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethod { public abstract class CreateDBFactory// 抽象工厂类 { abstract public DBAccess createDataBase(); // 工厂方法 } public class SqlServerFactory : CreateDBFactory// SQL Server工厂,继承自CreateDBFactory类 { // 返回SQL Server数据库 public override DBAccess createDataBase() { return new SqlServer(); } } public class AccessFactory : CreateDBFactory//Access工厂,继承自CreateDBFactory类 { public override DBAccess createDataBase()// 返回Access数据库 { return new Access(); } } }
FrmQuestion.cs
namespace FactoryMethod { public partial class FrmQuestion : Form { public FrmQuestion() { InitializeComponent(); this.RSql.CheckedChanged += new EventHandler(rbtn_CheckedChanged); this.RAccess.CheckedChanged += new EventHandler(rbtn_CheckedChanged); this.RTxt.CheckedChanged += new EventHandler(rbtn_CheckedChanged); } private string selectedDB = null; void rbtn_CheckedChanged(object sender, EventArgs e) { selectedDB = ((RadioButton)sender).Text; this.lblSelectedInfo.Text = "您选择了" + selectedDB + "数据源!"; this.gboxSelect.Enabled = false; this.btnShowData.Enabled = true; } private void btnSelectNewDB_Click(object sender, EventArgs e)//切换数据库 { if (this.gboxSelect.Enabled == true) { MessageBox.Show("您还没有选择数据源,请选择!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } this.RSql.Checked = false; this.RAccess.Checked = false; this.RTxt.Checked = false; this.gboxSelect.Enabled = true; this.lblSelectedInfo.Text = null; this.btnShowData.Enabled = false; this.dgvData.DataSource = null; } private void btnShowData_Click(object sender, EventArgs e)//在DataGridView中显示数据 { switch (selectedDB) { case "SQL Server": this.dgvData.DataSource = new SqlServerFactory().createDataBase().GetData(); string selInfo = "select ID,txtLeft,txtOper,txtRight from Question"; string connectionString = "Data Source=.;Initial Catalog=Calculator;Integrated Security=True;Pooling=False"; SqlConnection conn = new SqlConnection(connectionString); SqlDataAdapter adapter; DataSet ds = new DataSet(); DataTable dt; conn.Open(); adapter = new SqlDataAdapter(selInfo, conn); adapter.Fill(ds, "Question"); dt = ds.Tables["Question"]; comboxID.ValueMember = "ID"; comboxID.DataSource = dt; conn.Close(); break; case "Txt": string[] n1 = new string[100]; n1 = File.ReadAllLines("Left.txt"); txtLeft.Text = n1[0]; string[] n2 = new string[100]; n2 = File.ReadAllLines("Oper.txt"); txtOper.Text = n2[0]; string[] n3 = new string[100]; n3 = File.ReadAllLines("Right.txt"); txtRight.Text = n3[0]; break; case "Access": this.dgvData.DataSource = new AccessFactory().createDataBase().GetData(); string selInfo1 = "select ID,txtLeft,txtOper,txtRight from Question"; string connectionString1 = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Calculator.mdb"; OleDbConnection conn1 = new OleDbConnection(connectionString1); OleDbDataAdapter adapter1; DataSet ds1 = new DataSet(); DataTable dt1; conn1.Open(); adapter1 = new OleDbDataAdapter(selInfo1, conn1); adapter1.Fill(ds1, "Question"); dt1 = ds1.Tables["Question"]; comboxID.ValueMember = "ID"; comboxID.DataSource = dt1; conn1.Close(); break; default: break; } } private void btnAdd_Click(object sender, EventArgs e) //在DataGridView中插入数据 { string symbol = txtOper.Text; string a = txtLeft.Text; string b = txtRight.Text; switch (selectedDB) { case "SQL Server": this.dgvData.DataSource = new SqlServerFactory().createDataBase().SetData(a, symbol, b); MessageBox.Show("数据插入成功!"); txtLeft.Clear(); txtOper.Clear(); txtRight.Clear(); break; case "Txt": StreamWriter Left = File.AppendText("Left.txt"); Left.WriteLine(txtLeft.Text); Left.Close(); StreamWriter Oper = File.AppendText("Oper.txt"); Oper.WriteLine(txtOper.Text); Oper.Close(); StreamWriter Right = File.AppendText("Right.txt"); Right.WriteLine(txtRight.Text); Right.Close(); MessageBox.Show("数据插入成功!"); txtLeft.Clear(); txtOper.Clear(); txtRight.Clear(); break; case "Access": this.dgvData.DataSource = new AccessFactory().createDataBase().SetData(a, symbol, b); MessageBox.Show("数据插入成功!"); txtLeft.Clear(); txtOper.Clear(); txtRight.Clear(); break; default: break; } } private void btnNext_Click(object sender, EventArgs e) { int n = 1; string[] n1 = new string[100]; n1 = File.ReadAllLines("Left.txt"); txtLeft.Text = n1[n]; string[] n2 = new string[100]; n2 = File.ReadAllLines("Oper.txt"); txtOper.Text = n2[n]; string[] n3 = new string[100]; n3 = File.ReadAllLines("Right.txt"); txtRight.Text = n3[n]; n++; } private void comboxID_SelectedIndexChanged(object sender, EventArgs e) { switch (selectedDB) { case "SQL Server": string selInfo = "select txtLeft,txtOper,txtRight from Question where ID='" + comboxID.Text.ToString().Trim() + "'"; string connectionString = "Data Source=.;Initial Catalog=Calculator;Integrated Security=True;Pooling=False"; SqlConnection conn = new SqlConnection(connectionString); SqlCommand sqlcmd = new SqlCommand(selInfo, conn); SqlDataReader sdr; conn.Open(); sdr = sqlcmd.ExecuteReader(); if (sdr.Read()) { txtLeft.Text = sdr["txtLeft"].ToString(); txtOper.Text = sdr["txtOper"].ToString(); txtRight.Text = sdr["txtRight"].ToString(); } conn.Close(); break; case "Access": string selInfo1 = "select txtLeft,txtOper,txtRight from Question where ID='" + comboxID.Text.ToString().Trim() + "'"; string connectionString1 = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Calculator.mdb"; OleDbConnection conn1 = new OleDbConnection(connectionString1); OleDbCommand sqlcmd1 = new OleDbCommand(selInfo1, conn1); OleDbDataReader sdr1; conn1.Open(); sdr1 = sqlcmd1.ExecuteReader(); if (sdr1.Read()) { txtLeft.Text = sdr1["txtLeft"].ToString(); txtOper.Text = sdr1["txtOper"].ToString(); txtRight.Text = sdr1["txtRight"].ToString(); } conn1.Close(); break; default: break; } } private void textBox4_KeyDown(object sender, KeyEventArgs e) { string symbol = txtOper.Text; double a = Convert.ToDouble(txtLeft.Text); double b = Convert.ToDouble(txtRight.Text); Context contex = null; if (symbol == "+") { contex = new Context(new Add()); //加法策略 } else if (symbol == "-") { contex = new Context(new Sub()); //减法策略 } else if (symbol == "*") //若为乘号 { contex = new Context(new Mul()); //乘法策略 } else if (symbol == "/") //若为乘号 { contex = new Context(new Div()); //除法策略 } string answer = contex.Cal(a, b, symbol).ToString(); //用answer来存计算出来的答案,此时已经计算出a,b两个数的运算结果。 if (e.KeyCode == Keys.Enter) //回车操作 { string result = txtLeft.Text + txtOper.Text + txtRight.Text;//把运算式子存在result里面 if (textBox4.Text == answer) //如果输入答案与计算出的answer相等 { MessageBox.Show("回答正确!"); //弹出回答正确 listBox1.Items.Add(result + "=" + textBox4.Text.Trim() + "√");//并把运算式子存在listbox里 } else //如果答错 { MessageBox.Show("答题错误!"); //弹出答题错误 listBox1.Items.Add(result + "=" + textBox4.Text.Trim() + "×");//同样把运算式子放在listbox } textBox4.Clear(); } } } }
1.新建一个数据库
2.单选按钮选中数据库,从而确定数据库的类型,并且往Txt数据源插入数据
3.此时程序自动新建了三个txt文本文件来作为数据源
4.txt数据源答题时
5.使用txt数据源做了2题后切换数据源,此时同样可以使用SQL Server数据源来答题。