1>SqlParamter的用法:
public int CheckUserLogin(string loginId, string loginPwd)
{
string sql = "select count(*) from Users where loginId=@uid and loginPwd=@pwd";
SqlParameter[] pms = new SqlParameter[] {
new SqlParameter("@uid",loginId),
new SqlParameter("@pwd",loginPwd)
};
return (int)SqlHelper.ExecuteScalar(sql, System.Data.CommandType.Text, pms);
}
2>
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace 封装
{
class SQLHelper
{
public static string GetConn()
{
string getconn = ConfigurationManager.ConnectionStrings["getConn"].ConnectionString;
return getconn;
}
//SQLHelper.ExecuteNonQuery()调用方法如下:
//SQLHelper.ExecuteNonQuery("insert into [promary] (proID,proName)values(@id,@name)",new SqlParameter("id",36),new SqlParameter("name","日本省"));
//params SqlParameter[] parameter 是一个可变参数的SqlParameter类型数组。
public static void ExecuteNonQuery(string sql ,params SqlParameter[] parameter)
{
SQLHelper.GetConn();
using (SqlConnection conn = new SqlConnection(SQLHelper.GetConn()))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach(SqlParameter s in parameter)
{
cmd.Parameters.Add(s);
}
//cmd.ExecuteNonQuery()可以返回一个执行SQL语句所影响到的行数(一般我们不需要这个返回值,所以不写返回值)
cmd.ExecuteNonQuery();
}
}
}
//SQLHelper.ExecuteScalar()调用方法如下:
//SQLHelper.ExecuteScalar("select count(*)from xs"); 或者
//SQLHelper.ExecuteSalar("select count(*) from xs where 专业名=@zym",new SqlParameter("zym","计算机"));
//ExcuteScalar()的返回值是object类型的(如果想返回int类型的数据,可先将cmd.ExecuteSalar()转化成int类型再进行返回)
public static object ExecuteScalar(string sql,params SqlParameter[] parameter)
{
SQLHelper.GetConn();
using(SqlConnection conn =new SqlConnection(SQLHelper.GetConn()))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (SqlParameter s in parameter)
{
cmd.Parameters.Add(s);
}
return cmd.ExecuteScalar();
}
}
}
//SQLHelper.DataSet()调用方法如下:
/*
DataTable dt = SQLHelper.DataSet("select * from xs where 专业名=@xh", new SqlParameter("xh", "计算机"));
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow drow = dt.Rows[i];//先取到dt表的第i行
//string name =Convert.ToString( drow[0]); //然后再取该行的第一列(索引从0开始)
string name = Convert.ToString(drow["姓名"]);//或者写成这样也可以。然后再取该行的"姓名"列
MessageBox.Show(name);
}
*/
//DataSet是将查询结果填充到本地内存中,这样即使与连接断开,服务器的连接断开,都不会影响数据的读取。但是它也有一个坏处,就是只有小数据量才能往里面存放,数据量大了就给你的本地内存冲爆了。电脑会卡死去。大数据量的话还得用SqlDataReader
public static DataTable DataSet(string sql,params SqlParameter[] parameter)
{
SQLHelper.GetConn();
using (SqlConnection conn = new SqlConnection(SQLHelper.GetConn()))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (SqlParameter s in parameter)
{
cmd.Parameters.Add(s);
}
DataSet ds = new DataSet();//或者直接用DataTable dt = new DataTable()
using (SqlDataAdapter dr = new SqlDataAdapter(cmd))
{
//dr.Fill(dt);//如果上面是直接用DataTable对象的话这里写这条语句就好了。把数据直接填充到DataTable表里。而是不填充到DataSet表集合里
dr.Fill(ds);
DataTable dt = ds.Tables[0]; //一个ds里面可以有很多个DataTabale表,这里我们取它的第一个表。(索引从0开始)
return dt; //返回一个DataTable类型名字为dt的表
}
}
}
}
//*******************************************************************错误的用法ExecuteReader用法
/*//调用方法()
SqlDataReader dr=SQLHelper.ExecuteReader("select * from xs");
while (dr.Read())
{
string name = dr.GetString(dr.GetOrdinal("姓名"));
MessageBox.Show(name);
}
*/
//其实这样是不行的。因为SqlDataReader对象在读取数据的时候需要一直连接数据库。也就是说conn连接要一直打开。当你调用SQLHelper.ExecuteReader()方法后,在using语句在结束时会先调用close方法关闭conn连接。然后自动调用欲被清除对象的Dispose()方法,来销毁这个连接。所以这个时候就会报错【阅读器关闭时尝试调用 Read 无效。】所以这个时候我们需要DataSet
//SqlDataReader对于小数据带来的是在麻烦,优点可以忽略不计,因为它是一条一条的读取服务器上的数据,数据少,或者数据多,对于内存来说基本上没有区别。所以,一般只有大数据的时候才会考虑用SqlDataReader
public static SqlDataReader ExecuteReader(string sql ,params SqlParameter[] parameter)
{
SQLHelper.GetConn();
using (SqlConnection conn = new SqlConnection(SQLHelper.GetConn()))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (SqlParameter s in parameter)
{
cmd.Parameters.Add(s);
}
//cmd.ExecuteReader()的返回值就是一个SqlDataReader类型
return cmd.ExecuteReader();
}
}
}
//*************************************************************************************
}
}
SqlParameter可变参数在开发过程中的具体用法
/// <summary>
/// 验证用户名与密码是否正确
/// </summary>
public class UserInfoDal
{
/// <summary>
/// 获取用户信息
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="userPwd">用户密码</param>
/// <returns>UserInfo类对象</returns>
public UserInfo GetUserInfo(string userName,string userPwd,string userMail)
{
DbHelperSQL db = new DbHelperSQL();
SqlParameter[]param={
new SqlParameter("@username",SqlDbType.NVarChar,100), //100表示该字段对应数据库中的字段数据长度
new SqlParameter("@userpwd",SqlDbType.VarChar,100), //例如:varchar(100)
new SqlParameter("@usermail",SqlDbType.VarChar,100)
};
param[0].Value = userName;
param[1].Value = userPwd;
param[2].Value = userMail;
DataTable dt = db.GetDataTable(
"select * from T_UserInfo where (UserName=@username or @UserMail=@usermail) and UserPwd=@userpwd", param);
UserInfo userinfo = null;
if (dt.Rows.Count>0)
{
userinfo=new UserInfo();
DataTableToEtity(userinfo,dt);
}
return userinfo;
}
}
我们在使用Sqlparameter参数的时候 需要注意的一点,当参数的值为0的时候,我们需要在0的前面添加一个(object) 。0之外的其他数值不需要这样。其实也是有原因的,
因为SqlParameter()方法有7个重载,其中第二个,和第三个参数是这样的
第二个重载:public SqlParameter(string parameterName,object value);
第三个重载:public SqlParameter(string parameterName,SqlDbType dbType); 而SqlDbType是一个枚举类型,0代表的是System.Int64. 64 位的有符号整数
所以当我们在使用new SqlPanameter("@age",0)的时候,调用的却是第三个重载。我们本意是想给@age赋0这个值,却错误的调用了第三个重载,0变成了一个数据类型,所以此时就会报错:提示:需要参数'@gender',但未提供该参数。(如果你要问,为什么写成1,2...等其他非0的值时候不会报这个错。。我的回答:我也不知道.......)
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string connStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
SqlParameter[] sp = new SqlParameter[]{
new SqlParameter("@userName","雪糕"),
new SqlParameter("@name","雪慧"),
new SqlParameter("@age",25),
//特别要注意这里:如果直接写成new SqlParameter("@gender",0)的话会报错;提示:需要参数 '@gender',但未提供该参数。所以需要在0前面加一个(object)
new SqlParameter("@gender",(object)0),
new SqlParameter("@mobile","18620082008"),
new SqlParameter("@email","123@163.com"),
new SqlParameter("@addres","广州天河"),
new SqlParameter("@remarks","没有备注")
};
cmd.CommandText = "insert into T_UserInfo (UserName,Name,Age,Gender,Mobile,Email,Addres,Remarks)values(@userName,@name,@age,@gender,@mobile,@email,@addres,@remarks)"; //注意参数不需要用单引号或者双引号引起来,否则会发生错误;例如'@name'就是错误的
cmd.Parameters.AddRange(sp);
int i = cmd.ExecuteNonQuery();
Console.WriteLine(i);
}
}
Console.ReadKey();
}
}
}
public bool Add(MoFeedBack m)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into CcTable(");
strSql.Append("shopid,shopname,description,content,statuscfg,article_tag_id,picurl,date,moduleid,phone)");
strSql.Append(" values (");
strSql.Append("@shopid,@shopname,@description,@content,@statuscfg,@article_tag_id,@picurl,@date,@moduleid,@phone)");
DbCommand cmd = database.GetSqlStringCommand(strSql.ToString());
database.AddInParameter(cmd, "@shopid", DbType.Int32, m.shopid);
database.AddInParameter(cmd, "@shopname", DbType.String, m.shopname);
database.AddInParameter(cmd, "@statuscfg", DbType.Int32, m.statuscfg);
database.AddInParameter(cmd, "@article_tag_id", DbType.Int32, m.article_tag_id);
database.AddInParameter(cmd, "@picurl", DbType.String, m.picurl);
database.AddInParameter(cmd, "@description", DbType.String, m.description);
database.AddInParameter(cmd, "@content", DbType.String, m.content);
database.AddInParameter(cmd, "@date", DbType.DateTime, m.date);
database.AddInParameter(cmd, "@moduleid", DbType.Int32, m.moduleid);
database.AddInParameter(cmd, "@phone", DbType.String, m.phone);
return database.ExecuteNonQuery(cmd) > 0;
}