本节主要讲解服务器端ASP.NET Web Service数据库配置和操作,客户端数据库操作。
HYAppFrame项目地址:https://sourceforge.net/u/chinahysoft/profile/
1. 服务器端数据库操作
HYAppFrame服务器端通过ASP.NET Web Service连接数据库。
数据库连接配置
在文件Web.config配置数据库,需设置数据库服务器地址Data Source、数据库名称Initial Catalog、访问帐号User Id、访问密码Password等。dbName不需修改。
<connectionStrings> <add name="dbName" connectionString="Data Source=localhost;Initial Catalog=hyappframe;Integrated Security=False;User Id=sa;Password=123456;"/> </connectionStrings>
数据库操作
在文件MyFuncLib.cs中定义函数OpenDatabase(string connString),返回一个活动的数据库连接SqlConnection,代码如下:
public static SqlConnection OpenDatabase(string connString) { SqlConnection conn = new SqlConnection(); try { conn.ConnectionString = connString; conn.Open(); } catch (Exception ex) { Log("Open database error:" + ex.Message + "\r\n" + ex.StackTrace); } return conn; }
数据库查询、更新操作
在文件master.asmx.cs中定义函数ExecQueryBySql(string sql, DataTable paras),将sql查询结果以DataTable形式返回;定义函数ExecNoneQueryBySql(string sql, DataTable paras),返回int型,0表示未影响任何记录,-1表示sql执行错误,>0表示返回受影响记录的条数。
public int ExecNoneQueryBySql(string sql, DataTable paras) { if (!IsLogin()) return -100; SqlConnection conn = MyFuncLib.OpenDatabase(MyFuncLib.connString); int result = 0; try { sql = DES.Decrypt(sql, MyFuncLib.passwordKey); SqlCommand comd = new SqlCommand(); comd.CommandTimeout = 1800; comd.Connection = conn; comd.CommandText = sql; comd.Parameters.Clear(); if (paras != null) { foreach (DataRow row in paras.Rows) { comd.Parameters.AddWithValue(MyFuncLib.Dtv(row, "name", string.Empty), MyFuncLib.Dtv(row, "value", string.Empty)); } } result = comd.ExecuteNonQuery(); } catch (Exception ex) { MyFuncLib.Log(ex.Message + "\r\n" + ex.StackTrace); result = -1; } finally { MyFuncLib.CloseDatabase(conn); } return result; }
为了提高Web Service安全性,启用了Session,要使用方法必须先通过身份验证,同时也对sql语句进行DES加密。具体代码如下:
[WebMethod(EnableSession = true)] public DataTable ExecQueryByNamed(string queryName, DataTable paras)
2. 客户端数据库操作
客户端使用Web Service提供的函数对数据库进行查询、更新。
直接调用Web Service数据库操作方法,需构造查询所需的参数。
DataTable sqlParams = new DataTable("sqlParametersDataTable"); sqlParams.Columns.Add(new DataColumn("name", System.Type.GetType("System.String"))); sqlParams.Columns.Add(new DataColumn("value", System.Type.GetType("System.String"))); DataRow dRow; foreach (ListItem item in paras) { dRow = sqlParams.NewRow(); dRow["name"] = item.Name; dRow["value"] = item.Value; sqlParams.Rows.Add(dRow); } dt = MyFuncLib.WS.ExecQueryBySql(DES.Encrypt(sql, MyFuncLib.PasswordKey), sqlParams);
为了调用简便,在客户端MyFuncLib.cs中封装函数DBCommandExecQueryBySql(string sql, ArrayList paras)、DBCommandExecScalarBySql(string sql, ArrayList paras)、DBCommandExecNoneQueryBySql(string sql, ArrayList paras)
不带参数的查询
string sql = "select 1"; string str = MyFuncLib.DBCommandExecScalarBySql(sql, null);
带参数的查询
string sql = "select 1 from yourtable where ID_ = @id"; ArrayList sqlParams = new ArrayList(); sqlParams.Add(new ListItem("@id", 1)); string str = MyFuncLib.DBCommandExecScalarBySql(sql, sqlParams);
封装后,数据库查询代码变得非常简洁。