# 关于数据库编程的几个要点,与Delphi相比较

我以前是用Delphi+SqL写数据库编程的,现在想转C#,发现有相同的地方,也有不同的地方。现在都记下来,怕一下子又忘记了。

1.显示数据


Delhpi里用Dataset+DataSource+DBGrid,且DBGrid的记录移动会相应更改当前记录;
C#中呢,开始我用DataSet.DataTable+dataGridView,发现很郁闷的事情:界面上移动dataGridView的记录,我却从DataSet中得不到当前的记录,这对于用惯Delphi的我太蛋疼了,唉,用了个笨办法,从dataGridView.CurrentRow.Cells取相关主键字段,然后再建一个DataSet(DS2),根据主键字段去查询。好的方法请往下看

2.操作数据(添加,修改,删除)


Delphi里这些操作实在太简单了,DataSet.Append; DataSet.Edit; DataSet.Delete; 最后用DataSet.Post;
到了C#呢?它的DataSet没有上面类似的函数,我又开始蛋疼了。唉,又用了个最笨的方法,我知道C#有执行命令的Command呀,那我就把语句(什么insert into,update ,delete)写好,把要的值就放在界面上让用户输入,输入完了按确定,先检查一下值的有效性,再赋值给语句的参数,然后执行,执行完后刷新显示的DataSet,还要重新绑定dataGridView。一个字,太累了。好的方法请往下看

3.事务

这个,C#的事务要比Delhpi的事务好控制多了,C#有个事务类

[csharp]  view plain copy
  1. SqlTransaction myst = mydb.BeginTransaction();  


后面再把这个myst对象赋值给相关执行命令,最后myst.Commit();或者myst.Rollback();其中可以设置事务级别等,具体可以查看SqlTransaction类的相关帮助。

4.C#比Delphi更酷的数据操作方法

Delphi中的DataSource其实在C#中也有对应的,那就是BindingSource,这个比Delphi的要强很多,且功能可谓广泛,可以绑定很多东西,例如数组等。下面看BindingSource用于数据库操作的方法,

[csharp]  view plain copy
  1. public DataSet DsCustomer;  
  2. public BindingSource BsCustomer;  
  3. DsCustomer = new DataSet();  
  4. DsCustomer = dbManage.getDataSet("select * from Customer""Customer");//自定义的一个过程,返回DataSet  
  5. BsCustomer = new BindingSource();  
  6. BsCustomer.DataSource = DsCustomer.Tables["Customer"];  
  7. dataGridView1.DataSource = BsCustomer;//这里把dataGridView1的DataSource指向BindingSource  


当我们把dataGridView1的DataSource指向BindingSource后,这里你在DataGridView中选择记录,就可以通过

[csharp]  view plain copy
  1. DataRowView drv = BsCustomer.Current as DataRowView;  
[csharp]  view plain copy
  1. DataRowView drv = BsCustomer.AddNew() as DataRowView;//如果是添加新记录的话  


注意一定是DataRowView不是DataRow。

亲们,有了这个drv后,你就可以

[html]  view plain copy
  1. drv.Delete();//删除  
  2. drv.BeginEdit();//开始修改  
  3. drv.EndEdit();//结束修改或者添加,提交的意思  
  4. drv.CancelEdit();//取消修改  


这些操作都直接反映到DataGridView中,与Delphi一样。

关于Delphi中像DBEdit等数据感知控件,C#没有,但C#的所有输入控件都有DataBindings,这个厉害哦,正如上面所说绑定广泛啊,何况数据库呢,小case。

[csharp]  view plain copy
  1. txtCusId.DataBindings.Add("Text", bsCustomer, "CusId");  


绑定了后,就像Delphi中一样了,你在这里输入的值就直接赋给bsCustomer对应的DataTable了。

 

数据的格式化显示

比如日期,金额等这些我们想友好的显示给用户看怎么办呢?

亲们,再告诉你们一个天大好消息呀,C#的格式化字符串与Delphi中的很多一样,且还要强大,大家可以搜索标准格式化字符串,还有自定义格式化字符串。C#还可以反格式化哦,厉害吧,比如12345.67格式化成¥12,345.67  ,可以根据¥12,345.67 得到12345.67,具体方法我就不详细说了,下面看绑定数据如何格式化

[html]  view plain copy
  1. 主要是两处需要格式化显示,一个是DataGridView,一个是textBox  
[html]  view plain copy
  1. dataGridView1.Columns["Weight"].DefaultCellStyle.Format = "N0";  
  2. //N是标准格式化字符,还有像C代表金额,等 。上面是设置DataGridView的Weight列的Format就行了  
  3. txtWeight.DataBindings.Add("Text", bsBoard, "Weight");  
  4. txtWeight.DataBindings["Text"].FormatString = "N0"; //设置DataBindings的FormatString  
  5. txtWeight.DataBindings["Text"].FormattingEnabled = true;  


说明:绑定显示后,修改textBox的时候,不用担心格式转换的问题,比如¥12,345.67,你更改为¥12,345.89可以,12345.89也可以

 

多个表同时提交,用事务,给大家我写的一个程序中的代码:

[csharp]  view plain copy
  1. void btnModify_Click(object sender, EventArgs e)  
  2. {  
  3.     if (this.dataGridView1.CurrentRow == nullreturn;  
  4.     string tmp = dataGridView1.CurrentRow.Cells["BoardId"].Value.ToString();  
  5.     DataRowView drv = BsBoard.Current as DataRowView;  
  6.     drv.BeginEdit();  
  7.     BoardCodeEdit bcefrm = new BoardCodeEdit();  
  8.     bcefrm.bsBoard = this.BsBoard;//bcefrm窗口根据bsBoard去绑定一些控件,bcefrm只需要写绑定的代码,及确定时判断一下数据正确性  
  9.     if (bcefrm.ShowDialog() == DialogResult.OK)  
  10.     {  
  11.         drv.EndEdit();  
  12.         SqlConnection mydb = dbManage.getConn();  
  13.         mydb.Open();  
  14.         SqlTransaction myst = mydb.BeginTransaction();  
  15.         try  
  16.         {  
  17.             dbManage.UpdateByDataSet(DsBoardCode, "BoardCode", mydb, myst);//这个过程见下面  
  18.             dbManage.AddOperateRecord("BoardCode", tmp, "修改""", mydb, myst);//这个是往操作记录表中加一个修改操作记录  
  19.             myst.Commit();  
  20.         }  
  21.         catch  
  22.         {  
  23.             myst.Rollback();  
  24.             MessageBox.Show("修改失败");  
  25.         }  
  26.         finally  
  27.         {  
  28.             mydb.Close();  
  29.         }  
  30.     }  
  31.     else  
  32.     {  
  33.         BsBoard.CancelEdit();  
  34.     }  
  35. }  
  36. /// <summary>  
  37. /// 用事务更新单个DataSet,指定表名,此表名必须要有主键  
  38. /// </summary>  
  39. /// <param name="ds">需更新的DataSet</param>  
  40. /// <param name="strTblName">表名</param>  
  41. /// <param name="con">数据库连接</param>  
  42. /// <param name="st">事务名</param>  
  43. /// <returns></returns>  
  44. public static int UpdateByDataSet(DataSet ds, string strTblName, SqlConnection con, SqlTransaction st)  
  45. {  
  46.     try  
  47.     {  
  48.         SqlDataAdapter myAdapter = new SqlDataAdapter();  
  49.         SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);//我们不用再写任何添加或修改的语句了,但数据表要有主键  
  50.         myAdapter.SelectCommand = new SqlCommand("select * from " + strTblName + " where 1<>1", con, st);  
  51.         myAdapter.InsertCommand = new SqlCommand("", con, st);//事务  
  52.         myAdapter.UpdateCommand = new SqlCommand("", con, st);  
  53.         myAdapter.DeleteCommand = new SqlCommand("", con, st);  
  54.         myAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();  
  55.         myAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();  
  56.         myAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();  
  57.         myAdapter.Update(ds, strTblName);  
  58.         return 0;  
  59.     }  
  60.     catch (Exception err)  
  61.     {  
  62.         throw err;  
  63.     }}/// <summary>  
  64. /// 用事务添加操作记录  
  65. /// </summary>  
  66. /// <param name="objectName">表名等其它</param>  
  67. /// <param name="objectKey">主键字段等其它</param>  
  68. /// <param name="operate">操作名称,如“添加”</param>  
  69. /// <param name="operateRemark">操作详细备注</param>  
  70. /// <param name="con">数据库连接</param>  
  71. /// <param name="st">事务名称</param>  
  72. /// <returns></returns>  
  73. public static bool AddOperateRecord(string objectName, string objectKey, string operate, string operateRemark, SqlConnection con, SqlTransaction st)  
  74. {  
  75.     bool r = false;  
  76.     object o = null;  
  77.     int seqno = 0;  
  78.     SqlCommand cmd1 = new SqlCommand("select max(SeqNo) as MSeqNo from OperateTable where ObjectName='" + objectName + "' and Objectkey ='" + objectKey + "'", con, st);  
  79.     o = cmd1.ExecuteScalar();  
  80.     if (o == DBNull.Value)  
  81.         seqno = 1;  
  82.     else  
  83.         seqno = (int)o + 1;  
  84.     SqlCommand cmd = new SqlCommand("insert into OperateTable values(@ObjectName,@Objectkey,@SeqNo,@Operate,@OperateRemark,@OperateTime,@OperatePerson)", con);  
  85.     cmd.Parameters.Add("@ObjectName", SqlDbType.VarChar, 100).Value = objectName;  
  86.     cmd.Parameters.Add("@Objectkey", SqlDbType.VarChar, 100).Value = objectKey;  
  87.     cmd.Parameters.Add("@SeqNo", SqlDbType.Int).Value = seqno;  
  88.     cmd.Parameters.Add("@Operate", SqlDbType.NVarChar, 20).Value = operate;  
  89.     cmd.Parameters.Add("@OperateRemark", SqlDbType.NVarChar, 400).Value = operateRemark;  
  90.     cmd.Parameters.Add("@OperateTime", SqlDbType.DateTime).Value = DateTime.Now;  
  91.     cmd.Parameters.Add("@OperatePerson", SqlDbType.VarChar, 50).Value = Public.CurrUserId;  
  92.     cmd.Transaction = st;  
  93.     r = cmd.ExecuteNonQuery() > 0;  
  94. <pre>    return r;  
  95. }  
  96.  </pre>  
  97. <p><br>  
  98. 大家认为如何?</p>  
  99. <p>欢迎提问。</p>  
  100. <pre></pre> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值