我以前是用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#有个事务类
- SqlTransaction myst = mydb.BeginTransaction();
后面再把这个myst对象赋值给相关执行命令,最后myst.Commit();或者myst.Rollback();其中可以设置事务级别等,具体可以查看SqlTransaction类的相关帮助。
4.C#比Delphi更酷的数据操作方法
Delphi中的DataSource其实在C#中也有对应的,那就是BindingSource,这个比Delphi的要强很多,且功能可谓广泛,可以绑定很多东西,例如数组等。下面看BindingSource用于数据库操作的方法,
- public DataSet DsCustomer;
- public BindingSource BsCustomer;
- DsCustomer = new DataSet();
- DsCustomer = dbManage.getDataSet("select * from Customer", "Customer");//自定义的一个过程,返回DataSet
- BsCustomer = new BindingSource();
- BsCustomer.DataSource = DsCustomer.Tables["Customer"];
- dataGridView1.DataSource = BsCustomer;//这里把dataGridView1的DataSource指向BindingSource
当我们把dataGridView1的DataSource指向BindingSource后,这里你在DataGridView中选择记录,就可以通过
- DataRowView drv = BsCustomer.Current as DataRowView;
- DataRowView drv = BsCustomer.AddNew() as DataRowView;//如果是添加新记录的话
注意一定是DataRowView不是DataRow。
亲们,有了这个drv后,你就可以
- drv.Delete();//删除
- drv.BeginEdit();//开始修改
- drv.EndEdit();//结束修改或者添加,提交的意思
- drv.CancelEdit();//取消修改
这些操作都直接反映到DataGridView中,与Delphi一样。
关于Delphi中像DBEdit等数据感知控件,C#没有,但C#的所有输入控件都有DataBindings,这个厉害哦,正如上面所说绑定广泛啊,何况数据库呢,小case。
- txtCusId.DataBindings.Add("Text", bsCustomer, "CusId");
绑定了后,就像Delphi中一样了,你在这里输入的值就直接赋给bsCustomer对应的DataTable了。
数据的格式化显示
比如日期,金额等这些我们想友好的显示给用户看怎么办呢?
亲们,再告诉你们一个天大好消息呀,C#的格式化字符串与Delphi中的很多一样,且还要强大,大家可以搜索标准格式化字符串,还有自定义格式化字符串。C#还可以反格式化哦,厉害吧,比如12345.67格式化成¥12,345.67 ,可以根据¥12,345.67 得到12345.67,具体方法我就不详细说了,下面看绑定数据如何格式化
- 主要是两处需要格式化显示,一个是DataGridView,一个是textBox
- dataGridView1.Columns["Weight"].DefaultCellStyle.Format = "N0";
- //N是标准格式化字符,还有像C代表金额,等 。上面是设置DataGridView的Weight列的Format就行了
- txtWeight.DataBindings.Add("Text", bsBoard, "Weight");
- txtWeight.DataBindings["Text"].FormatString = "N0"; //设置DataBindings的FormatString
- txtWeight.DataBindings["Text"].FormattingEnabled = true;
说明:绑定显示后,修改textBox的时候,不用担心格式转换的问题,比如¥12,345.67,你更改为¥12,345.89可以,12345.89也可以
多个表同时提交,用事务,给大家我写的一个程序中的代码:
- void btnModify_Click(object sender, EventArgs e)
- {
- if (this.dataGridView1.CurrentRow == null) return;
- string tmp = dataGridView1.CurrentRow.Cells["BoardId"].Value.ToString();
- DataRowView drv = BsBoard.Current as DataRowView;
- drv.BeginEdit();
- BoardCodeEdit bcefrm = new BoardCodeEdit();
- bcefrm.bsBoard = this.BsBoard;//bcefrm窗口根据bsBoard去绑定一些控件,bcefrm只需要写绑定的代码,及确定时判断一下数据正确性
- if (bcefrm.ShowDialog() == DialogResult.OK)
- {
- drv.EndEdit();
- SqlConnection mydb = dbManage.getConn();
- mydb.Open();
- SqlTransaction myst = mydb.BeginTransaction();
- try
- {
- dbManage.UpdateByDataSet(DsBoardCode, "BoardCode", mydb, myst);//这个过程见下面
- dbManage.AddOperateRecord("BoardCode", tmp, "修改", "", mydb, myst);//这个是往操作记录表中加一个修改操作记录
- myst.Commit();
- }
- catch
- {
- myst.Rollback();
- MessageBox.Show("修改失败");
- }
- finally
- {
- mydb.Close();
- }
- }
- else
- {
- BsBoard.CancelEdit();
- }
- }
- /// <summary>
- /// 用事务更新单个DataSet,指定表名,此表名必须要有主键
- /// </summary>
- /// <param name="ds">需更新的DataSet</param>
- /// <param name="strTblName">表名</param>
- /// <param name="con">数据库连接</param>
- /// <param name="st">事务名</param>
- /// <returns></returns>
- public static int UpdateByDataSet(DataSet ds, string strTblName, SqlConnection con, SqlTransaction st)
- {
- try
- {
- SqlDataAdapter myAdapter = new SqlDataAdapter();
- SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);//我们不用再写任何添加或修改的语句了,但数据表要有主键
- myAdapter.SelectCommand = new SqlCommand("select * from " + strTblName + " where 1<>1", con, st);
- myAdapter.InsertCommand = new SqlCommand("", con, st);//事务
- myAdapter.UpdateCommand = new SqlCommand("", con, st);
- myAdapter.DeleteCommand = new SqlCommand("", con, st);
- myAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
- myAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();
- myAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();
- myAdapter.Update(ds, strTblName);
- return 0;
- }
- catch (Exception err)
- {
- throw err;
- }}/// <summary>
- /// 用事务添加操作记录
- /// </summary>
- /// <param name="objectName">表名等其它</param>
- /// <param name="objectKey">主键字段等其它</param>
- /// <param name="operate">操作名称,如“添加”</param>
- /// <param name="operateRemark">操作详细备注</param>
- /// <param name="con">数据库连接</param>
- /// <param name="st">事务名称</param>
- /// <returns></returns>
- public static bool AddOperateRecord(string objectName, string objectKey, string operate, string operateRemark, SqlConnection con, SqlTransaction st)
- {
- bool r = false;
- object o = null;
- int seqno = 0;
- SqlCommand cmd1 = new SqlCommand("select max(SeqNo) as MSeqNo from OperateTable where ObjectName='" + objectName + "' and Objectkey ='" + objectKey + "'", con, st);
- o = cmd1.ExecuteScalar();
- if (o == DBNull.Value)
- seqno = 1;
- else
- seqno = (int)o + 1;
- SqlCommand cmd = new SqlCommand("insert into OperateTable values(@ObjectName,@Objectkey,@SeqNo,@Operate,@OperateRemark,@OperateTime,@OperatePerson)", con);
- cmd.Parameters.Add("@ObjectName", SqlDbType.VarChar, 100).Value = objectName;
- cmd.Parameters.Add("@Objectkey", SqlDbType.VarChar, 100).Value = objectKey;
- cmd.Parameters.Add("@SeqNo", SqlDbType.Int).Value = seqno;
- cmd.Parameters.Add("@Operate", SqlDbType.NVarChar, 20).Value = operate;
- cmd.Parameters.Add("@OperateRemark", SqlDbType.NVarChar, 400).Value = operateRemark;
- cmd.Parameters.Add("@OperateTime", SqlDbType.DateTime).Value = DateTime.Now;
- cmd.Parameters.Add("@OperatePerson", SqlDbType.VarChar, 50).Value = Public.CurrUserId;
- cmd.Transaction = st;
- r = cmd.ExecuteNonQuery() > 0;
- <pre> return r;
- }
- </pre>
- <p><br>
- 大家认为如何?</p>
- <p>欢迎提问。</p>
- <pre></pre>