对ExecuteNonQuery,ExecuteScalar,DataSet 进行封装(params可变参数的用法)Sqlparameter

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)的时候,调用的却是第三个重载。我们本意是想给@age0这个值,却错误的调用了第三个重载,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;
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值