sqlhelper 的类型初始值设定项引发异常

默认分类 未结 1 1226
_Datura丶私欲
_Datura丶私欲 2023-03-18 09:49
相关标签:
1条回答
  • 2023-03-18 10:10

    1. 封装方法的原则

        把不变的代码写入方法中,把变化的部分通过参数传递

        不变的代码:连接数据、执行数据库操作的方法等

         变化的部分:SQL语句,进行参数化查询的时候需要传递的参数

    2. 实现SQLHelper类

    1 //不声明为publc的目的:这个类只在程序集当中使用,不必对外。 2 //尽可能地对外少暴露publc类 3 class SQLHelper 4 { 5 //连接数据库的字符串 6 private static string strConn = ConfigurationManager.ConnectionStrings["dbconStr"].ConnectionString; 7 8 /// 9 /// 执行非查询sql语句,如insert、delete、update 10 /// 11 /// 要执行的sql语句 12 /// sql语句中的参数 13 /// 执行语句后,受到影响的行数 14 public static int ExecuteNoQuery(string sqlCmd, params SqlParameter[] parameters) 15 { 16 using (SqlConnection conn = new SqlConnection(strConn)) 17 { 18 conn.Open(); 19 using (SqlCommand cmd = conn.CreateCommand()) 20 { 21 cmd.CommandText = sqlCmd; 22 cmd.Parameters.AddRange(parameters); 23 return cmd.ExecuteNonQuery(); 24 } 25 } 26 } 27 28 /// 29 /// 一般用于返回一个数据的查询数据,如查询一个学生的数学成绩 30 /// 31 /// 要执行的sql语句 32 /// sql语句中的参数 33 /// 查询结果,object类型 34 public static object ExecuteScalar(string sqlCmd, params SqlParameter[] parameters) 35 { 36 using (SqlConnection conn = new SqlConnection(strConn)) 37 { 38 conn.Open(); 39 using (SqlCommand cmd = conn.CreateCommand()) 40 { 41 cmd.CommandText = sqlCmd; 42 cmd.Parameters.AddRange(parameters); 43 return cmd.ExecuteScalar(); 44 } 45 } 46 } 47 48 /// 49 /// 将查询结果以DataSet的形式返回 50 /// 51 /// 要执行的sql语句 52 /// sql语句中的参数 53 /// 数据集合,DataSet类型 54 public static DataSet ExecuteDataSet(string sqlCmd, params SqlCommand[] parameters) 55 { 56 using (SqlConnection conn = new SqlConnection(strConn)) 57 { 58 conn.Open(); 59 using (SqlCommand cmd = conn.CreateCommand()) 60 { 61 cmd.CommandText = sqlCmd; 62 cmd.Parameters.AddRange(parameters); 63 SqlDataAdapter adpter = new SqlDataAdapter(cmd); 64 DataSet dataset = new DataSet(); 65 adpter.Fill(dataset); 66 return dataset; 67 } 68 } 69 } 70 71 /// 72 /// 执行查询结果数据量较大的查询语句,如查询1000个学生的信息 73 /// 74 /// 要执行的sql语句 75 /// sql语句中的参数 76 /// 一个Staff类型的List 77 public static List ExecuteReader(string sqlCmd, params SqlParameter[] parameters) 78 { 79 using (SqlConnection conn = new SqlConnection(strConn)) 80 { 81 conn.Open(); 82 using (SqlCommand cmd = conn.CreateCommand()) 83 { 84 cmd.CommandText = sqlCmd; 85 cmd.Parameters.AddRange(parameters); 86 87 SqlDataReader reader = cmd.ExecuteReader(); 88 List lStaff = new List(); 89 while (reader.Read()) 90 { 91 lStaff.Add(new Staff() 92 { 93 Name = (string)reader["Name"], 94 Age = (int)reader["Age"], 95 Sex = (bool)reader["Sex"], 96 Height = (decimal)reader["Height"], 97 Salary = (decimal)reader["Salary"], 98 //数据库中有些数据可以为空,如果使用强制转换的话,会出现错误 99 //应该使用as来转换100 Department = reader["Department"] as string101 });102 }103 return lStaff;104 }105 }106 }107 }

    3. 调用SQLHelper类

    string sqlCmd = "insert into t_staff(Name,Age,Sex,Height,Salary) values(‘郑冰‘,27,1,1.64,3000)"; SQLHelper.ExecuteNoQuery(sqlCmd); string sqlCmd = "select Salary from t_staff where id > 2"; DataSet dataset = SQLHelper.ExecuteDataSet(sqlCmd); DataTable table = dataset.Tables[0]; foreach(DataRow row in table.Rows) { MessageBox.Show(row[0].ToString() + " == " + row["Salary"].ToString()); } string sqlCmd = "select Salary from t_staff where Name = @value"; object salary = SQLHelper.ExecuteScalar(sqlCmd, new SqlParameter("@value", "马金")); MessageBox.Show(salary.ToString()); string sqlCmd = "select * from t_staff"; List lStaff = SQLHelper.ExecuteReader(sqlCmd);

    SQLHelper

    标签:

    项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑。  原来是按照网上对PetShop的介绍来给各项目添加引用的。  1、Web 引用 BLL。 2、BLL 引用 IDAL,Model,使用DALFactory创建实例。 3、IDAL 引用 Model。 4、Model 无引用。 5、DALFactory 引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。 6、SQLServerDAL 引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。 问题就出在这里了。顶! 按照PetShop的架构,是DALFactory程序集里通过反射创建针对特定数据访问层里的对应类实例,这样BLL调用接口时就知道调用这个对应类实例里的实现方法。 而反射动态加载程序集是通过这种方法 Assembly.Load("程序集").CreateInstance("命名空间.类"),其中的“程序集”读取的是Web层bin文件夹下对应的dll,即反射加载的程序集dll在Web层的bin文件夹必须有,不然就会出现如题的错误。问题解决了~^_^ 出现这种错误的另两种情况,这也是在网上看到的,一起写下来。 一、Web.config配置错误。 在DALFactory程序集里的DataAccess类里,通过 private static readonly string path = ConfigurationManager.AppSettings["WebDAL"]; 来获得程序集的名称的。 在Web.config里我的配置如下: 二、程序集名称和默认命名空间错误。 在各个程序集右键--属性,看看程序集名称和默认命名空间有没有写错。这个问题也可能导致如题的错误~~ 我直接复制别人的....!!!

    用TaskSwitching_Enable_Disable这个方法可以屏蔽Alt+Tab, Alt+Esc, Ctrl+Esc, Win, Ctrl+Shift+Esc用法一样using System.Runtime.InteropServices;[DllImport("WinLockDll.dll")]public static extern int TaskSwitching_Enable_Disable(bool bEnableDisable); 0| 评论

    这段 是你自己写的还是自动生成的呢最好是要vs自动生成的,再调用ConfigurationManager.ConnectionStrings["constring"].ConnectionString;将readonly去掉

    所提供的错误信息还不够,无法分析,给出原始的错误信息

    0 讨论(0)
提交回复