ASP.NET2.0中插入、删除、查询、修改记录这么多方法,究竟哪种最通用,最常用?100分全给
现在有个问题困扰我很长时间,我是从asp直接转到asp.net2.0的,在ASP.NET2.0中对数据库进行插入、删除、查询、修改四项操作时,我发现有好种方法,现在我搞不清该用哪种:
1. 最初我用SqlDataSource+GridView之类的快捷操作,但不久发现这个方法只在简单的情况下快捷,不通用,不灵活。
2.后来用Command,类似下面的方法:
SqlCommand command = new SqlCommand( "INSERT INTO UserPhoto (UserName,ContentType,Photo) " +
"VALUES (@UserName,@ContentType,@Photo) ", myConnection);
//使用Parameters.AddWithValue实现对参数的赋值
command.Parameters.AddWithValue( "@UserName ", TextBox1.Text);
command.Parameters.AddWithValue( "@ContentType ", fileType);
command.Parameters.AddWithValue( "@Photo ", fileData);
//打开连接,执行查询
myConnection.Open();
command.ExecuteNonQuery();
myConnection.Close();
2.又发现有人使用SqlDataSource,类似下面的代码:
protected void btnInsert_Click(object sender, EventArgs e)
{
SqlDataSource sds = new SqlDataSource();
sds.ConnectionString = ConfigurationManager.ConnectionStrings[ "ConnStr "].ToString();
sds.InsertCommand = "Insert into T_Product(F_Name,F_Price,F_Unit) values(@Name,@Price,@Unit) ";
sds.InsertParameters.Add( "Name ", txtName.Text.Trim());
sds.InsertParameters.Add( "Price ", txtPrice.Text.Trim());
sds.InsertParameters.Add( "Unit ", txtUnit.Text.Trim());
sds.Insert();
}
3.有人直接用DataSet,操作行对象、列对象
4.有人创建一个数据操作的类,将用到的各个插入、删除、查询等当作类的方法,调用方法来操作数据.
5。还有人在VS2005中新建数据集,创建.xsd文件来执行一些类似操作,有时还配合ObjectDataSource控件
我现在被搞的晕极了,不知通常情况下,应该用哪种方法,查了一下msdn,好像上面这些方法都能找到影子,但我真想知道哪种方法才是大家最常用的,通用的方法是什么?请高人伸出你热情的手,指点一下吧!
[解决办法]
增 删 改
SQL SERVER我是认为应该放在存储过程里
不仅仅从效率上提升
可能你对增删改有事务的放在存储过程里也能更好的处理
论开发效率 运行效率和维护性 来说 存储过程是最好
查的话 涉及到复杂点的语句我一般也是放在存储过程里
如果非要放在CS里的话 , 一定要参数化SQL语句 最大的好处是可以防止注入
而且维护也相对轻松
[解决办法]
1. 最初我用SqlDataSource+GridView之类的快捷操作,但不久发现这个方法只在简单的情况下快捷,不通用,不灵活。
==================================
这个是给初学者用的,不能实现复杂的功能
2.后来用Command,类似下面的方法:
==================================
这个是纯写代码方式的,适合从2003转过来的
3.又发现有人使用SqlDataSource,类似下面的代码:
==================================
我一般教初学者都是方法 2 + 3,简单的功能用3,复杂的功能用2实现,用3的好处是不用再关心数据库的连接和打开,这些优化的工作可以让SqlDataSource完成
4.有人直接用DataSet,操作行对象、列对象
==================================
如果只是读数据,没必要用4,如果是进行简单的增删改,也没必要用4,如果你要打算对数据进行比较复杂的操作,可以用4,尤其适合winform类应用程序
5.有人创建一个数据操作的类,将用到的各个插入、删除、查询等当作类的方法,调用方法来操作数据.
==================================
使用三层架构的时候经常这样做
6.还有人在VS2005中新建数据集,创建.xsd文件来执行一些类似操作,有时还配合ObjectDataSource控件
==================================
如果是用强类型的DataSet,增加了开发效率,降低了系统的维护代价,对内存的消耗多一点
[解决办法]
初学ado.net最好使用直接的操作
[解决办法]
所谓的直接操作,就是自己手动去建立每一个对象
比如SqlConnection,SqlDataAdapter,这样可以让你懂得一些东西的基本工作原理
我个人建议是,结合PetShop4.0的SqlHelper来学,自己手动写一遍数据库操作类。
然后你就知道你问的那些东西应该如何是从了;
方法有很多种,你需要的是找到适合你的那种,先从基本入手吧。
地基没打好,羡慕别人房子怎么盖是没用的。
[解决办法]
这几种通常都要用到,我给你 个例子:
这是mysql的,sqlserver的也一样,改的东西不多
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
using System.Text;
/// <summary>
/// DAO 的摘要说明
/// </summary>
public class DAO
{
private string connString;
private MySqlConnection conn = null;
private MySqlCommand cmd;
private MySqlDataAdapter dataAdapter;
public DAO()
{
this.connString = System.Configuration.ConfigurationManager.ConnectionStrings[0].ToString();
this.conn = new MySqlConnection(connString);
}
/// <summary>
/// 实例化一个MySqlCommand对象
/// </summary>
/// <param name= "sql "> sql语句 </param>
/// <returns> MySqlCommand对象 </returns>
public MySqlCommand BuildCommand(string sql)
{
MySqlCommand myCmd = new MySqlCommand(sql, conn);
myCmd.CommandTimeout = 0;//设置一条语句的执行时间为无限
return myCmd;
}
/// <summary>
/// 获得一个DataSet。不需要打开、关闭数据库,直接调用就可以了
/// </summary>
/// <param name= "sql "> sql语句 </param>
/// <returns> DataSet集合 </returns>
public DataSet GetDateSet(string sql)
{
this.cmd = BuildCommand(sql);
OpenConn();
dataAdapter = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
CloseConn();
return ds;
}
/// <summary>
/// 获得一个DataReader,已打开了与数据库的连接,完成所有操作后,必须调用CloseConn()方法关闭与数据库的连接
/// </summary>
/// <param name= "sql "> sql语句 </param>
/// <returns> DataReader </returns>
public MySqlDataReader GetDataReader(string sql)
{
this.cmd = BuildCommand(sql);
OpenConn();
MySqlDataReader sdr=cmd.ExecuteReader();
return sdr;
}
/// <summary>
/// 增、删、改 等操作都必须调用此方法。不需要打开、关闭数据库,直接调用就可以了
/// </summary>
/// <param name= "sql "> sql语句 </param>
/// <returns> 受影响的行数 </returns>
public int Update(string sql)
{
this.cmd = BuildCommand(sql);
OpenConn();
int rowsAffected=cmd.ExecuteNonQuery();
CloseConn();
return rowsAffected;
}
/// <summary>
/// 打开与数据库的连接
/// </summary>
public void OpenConn()
{
//检测数据库连接对象conn是否为空
if (conn == null)
{
conn = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[0].ToString());
}
/*以上三行chz添加--2007年2月9日*/
try
{
if ((conn != null)&&(conn.State != ConnectionState.Open))
{
conn.Open();
}
}
catch (MySqlException ex)
{
if ((conn != null) && (conn.State != ConnectionState.Closed))
{
conn.Close();
}
}
}
/// <summary>
/// 关闭与数据库的连接
/// </summary>
public void CloseConn()
{
try
{
if ((conn != null) && (conn.State != ConnectionState.Closed))
{
conn.Close();
}
}
catch (MySqlException ex)
{
}
}
/// <summary>
/// 替换危险字符
/// </summary>
/// <param name= "inputString "> </param>
/// <param name= "MaxLength "> </param>
/// <returns> </returns>
public string ClearStringInput(string inputString)
{//构造临时字符串数组
StringBuilder retVal = new StringBuilder();
if ((inputString != null) && (inputString != String.Empty))
{
//清空字符串两段的空白符号
inputString = inputString.Trim();
for (int i = 0; i < inputString.Length; i++)
{
switch (inputString[i])
{
//替换危险字符串
case ' " ': retVal.Append( "" "); break;
case ' < ': retVal.Append( "< "); break;
case '> ': retVal.Append( "> "); break;
default: retVal.Append(inputString[i]); break;
}
}
//替换字符 " ' "
retVal.Replace( " ' ", " ");
}
return retVal.ToString();
}
}
[解决办法]
5应该是最常用的,方便维护,如果需求变化了,改少量代码就可以了。
生成三层架构,有代码生成器。
xsd很耗内存,但是会防止并发。
不过三层架构使用存储过程也可以防止并发
[解决办法]
实际应用中,还是5和6用的比较多
如果初学者在使用的时候,能分辨什么用1,2,3,4,那么证明对控件是很熟悉的
[解决办法]
直接用sql语句写 或者用存储过程 利用sqlhelper
[解决办法]
对于小型项目,使用SqlDataSource还是很节省时间和代码的,其实基本就是说和数据库的交互我们不用操心,只要关心参数的值的变化即可
实际应用中即时使用数据库操作类,还是可以使用ObjectDataSource来完成很多业务层的绑定工作
[解决办法]
如果是初学者,先用1,能显示出来数据就不错了
然后一定要学会2,要知道用1和2实现的功能完全一样,但现在是自己控制了
那如何“根据具体情况来定”呢,举个例子在自己写页面的时候可能会发现有时页面需要容器控件的嵌套,比如DataList里每个ItemTemplate中有一个GridView,用2(纯代码)当然可以解决,但如果想代码量少些,可以在每个ItemTemplate加上一个SqlDataSource,让每一个ItemTemplate中的GridView绑定到整个SqlDataSource上,你就会发现需要动态地给SqlDataSource的SelectParameters赋值,而此时如果想Delete的话DeleteParameters也是动态的,那么用3就比较合适了,比如
//要先FindControl到SqlDataSource2
SqlDataSource2.DeleteParameters[ "ID "].DefaultValue = GridView1.DataKeys[e.RowIndex].Value.ToString();
SqlDataSource2.Delete();
如果还想进行内层的GridView的更新,如果内层的GridView用的不是模版列的话,用3可以很方便的进行Update操作,如果用的是模版列,那么用自己2(自己手写代码的方式)会更合适
------解决方案--------------------
专家门诊-ASP.NET开发答疑200(适合初学)
LTPASP.NET知识库