现在有个问题困扰我很长时间,我是从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,好像上面这些方法都能找到影子,但我真想知道哪种方法才是大家最常用的,通用的方法是什么?请高人伸出你热情的手,指点一下吧!
"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语句 最大的好处是可以防止注入
而且维护也相对轻松
==================================
这个是给初学者用的,不能实现复杂的功能2.后来用Command,类似下面的方法:
==================================
这个是纯写代码方式的,适合从2003转过来的
3.又发现有人使用SqlDataSource,类似下面的代码:
==================================
我一般教初学者都是方法 2 + 3,简单的功能用3,复杂的功能用2实现,用3的好处是不用再关心数据库的连接和打开,这些优化的工作可以让SqlDataSource完成4.有人直接用DataSet,操作行对象、列对象
==================================
如果只是读数据,没必要用4,如果是进行简单的增删改,也没必要用4,如果你要打算对数据进行比较复杂的操作,可以用4,尤其适合winform类应用程序5.有人创建一个数据操作的类,将用到的各个插入、删除、查询等当作类的方法,调用方法来操作数据.
==================================
使用三层架构的时候经常这样做6.还有人在VS2005中新建数据集,创建.xsd文件来执行一些类似操作,有时还配合ObjectDataSource控件
==================================
如果是用强类型的DataSet,增加了开发效率,降低了系统的维护代价,对内存的消耗多一点
比如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();
}}
生成三层架构,有代码生成器。xsd很耗内存,但是会防止并发。不过三层架构使用存储过程也可以防止并发
----------
不要依賴控件帶來的方便-----不能實現復雜功能;維護有難度~~~~
amandag(高歌)讲得很不错
无语,且不说,用存储过程分页是否真的就高效?通用的,必定在性能和扩展性上妥协,
高效的查询,所使用的 SQL 与具体的数据库模式紧密相关
不是说ASP.NET可以比1.1减少70%的编码吗?在哪能体现出来?
用SQLhelper不是让2.0和1.1都一样了吗?按照第5种做法数据库操作上没有什么本质变化呀?数据源控件引入的意义在哪?难道就是让我们初学者拖拽一下,做的简单的东西玩玩?做完了就在这迷茫?如果是这样,微软不如上来直接告诉我,想用asp.net2.0实际和1.1是一样的,真正解决问题还是要自己设计类或用SQLHelper,而不是我们新加的那几个新控件,WebCast上那些快捷操作的教程实际是误导你们的。实际开发中还是要回归到设计数据库操作类或引用SqlHelper,是这样吗?
“视具体情况而定”我不清楚是哪些情况下对应哪种方法,能具体说明一下吗?
再次感谢!
//要先FindControl到SqlDataSource2
SqlDataSource2.DeleteParameters["ID"].DefaultValue = GridView1.DataKeys[e.RowIndex].Value.ToString();
SqlDataSource2.Delete();如果还想进行内层的GridView的更新,如果内层的GridView用的不是模版列的话,用3可以很方便的进行Update操作,如果用的是模版列,那么用自己2(自己手写代码的方式)会更合适
不知各位都看什么好书?怎么学的这么好呀?
LTPASP.NET知识库