| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 832 人关注过本帖
标题:学习三层架构,遇到个问题,求助大牛们
只看楼主 加入收藏
tianqy
Rank: 5Rank: 5
等 级:职业侠客
帖 子:260
专家分:332
注 册:2011-4-7
结帖率:91.43%
收藏
已结贴  问题点数:100 回复次数:7 
学习三层架构,遇到个问题,求助大牛们
学习三层架构,遇到这个问题,代码检查了,应该没有问题,层之间的映射关系也对着,求助:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="ConnectionString"
         connectionString="Data Source=.\sqlexpress;Initial Catalog=AddressList;Integrated Security=True"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>
SqlhelperDB.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace SQLDAL
{
    ///针对SQL Server数据库操作的通用类:
    public class SqlDbHelper
    {
        private static string connString =
              ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        public static string ConnectionString
        {
            get { return connString; }
            set { connString = value; }
        }

        //编写ExecuteDataTable方法,对数据库进行非连接式查询操作:
        public static DataTable ExecuteDataTable(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            DataTable data = new DataTable();
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(commandText, conn))
                {
                     = commandType;
                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(data);
                }
            }
            return data;
        }
        //继续编写俩个重载的ExecuteDataTable方法:
        public static DataTable ExecuteDataTable(string commandText)
        {
            return ExecuteDataTable(commandText, CommandType.Text, null);
        }
        public static DataTable ExecuteDataTable(string commandText, CommandType commandType)
        {
            return ExecuteDataTable(commandText, commandType, null);
        }

        //编写ExecuteReader方法,对数据库进行连接式查询:
        public static SqlDataReader ExecuteReader(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(commandText, conn);
             = commandType;
            if (parameters != null)
            {
                foreach (SqlParameter param in parameters)
                {
                    cmd.Parameters.Add(param);
                }
            }
            conn.Open();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        //继续编写俩个重载ExecuteReader方法
        public static SqlDataReader ExecuteReader(string commandText)
        {
            return ExecuteReader(commandText, CommandType.Text, null);
        }
        public static SqlDataReader ExecuteReader(string commandText, CommandType commandType)
        {
            return ExecuteReader(commandText, commandType, null);
        }

        //编写ExecuteScalar方法,对数据库进行单个值的检索
        public static Object ExecuteScalar(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            object result = null;
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(commandText, conn))
                {
                     = commandType;
                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    conn.Open();
                    result = cmd.ExecuteScalar();
                }
            }
            return result;
        }
        //继续编写俩个重载ExecuteScalar方法:
        public static Object ExecuteScalar(string commandText)
        {
            return ExecuteScalar(commandText, CommandType.Text, null);
        }
        public static Object ExecuteScalar(string commandText, CommandType commandType)
        {
            return ExecuteScalar(commandText, commandType, null);
        }

        //编写ExecuteNonQuery方法,对数据库进行增、删、改操作:
        public static int ExecuteNonQuery(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            int count = 0;
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(commandText, conn))
                {
                     = commandType;
                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    conn.Open();
                    count = cmd.ExecuteNonQuery();
                }
            }
            return count;
        }
        //继续编写俩个重载ExecuteNonQuery方法:
        public static int ExecuteNonQuery(string commandTex)
        {
            return ExecuteNonQuery(commandTex, CommandType.Text, null);
        }
        public static int ExecuteNonQuery(string commandText, CommandType commandType)
        {
            return ExecuteNonQuery(commandText, commandType, null);
        }
    }
}
BLL层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class User
    {
        SQLDAL.User user = new SQLDAL.User();
        public bool Login(string userName, string userPwd)
        {
            return user.Login(userName,userPwd);
        }
        public bool Update(Model.User model)
        {
            return user.Update(model);
        }
    }
}


SQLDA层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SQLDAL
{
    //数据访问类:User
    public partial class User
    {
        public User()
        { }
        #region Method
        //判断用户名、密码是否正确:
        public bool Login(string userName, string userPassword)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select count(1) from [User] ");
            strSql.Append(" where UserName=@UserName and Password=@UserPassword");
            SqlParameter[] parameters = {
                                        new SqlParameter("@UserName",SqlDbType.NVarChar,50),
                                        new SqlParameter("@UserPassword",SqlDbType.NVarChar,50)
                                        };
            parameters[0].Value = userName;
            parameters[1].Value = userPassword;
            int n = Convert.ToInt32(SqlDbHelper.ExecuteScalar(strSql.ToString(), CommandType.Text, parameters));
            if (n == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
}
搜索更多相关主题的帖子: 学习 关系 version 
2012-12-30 15:33
tianqy
Rank: 5Rank: 5
等 级:职业侠客
帖 子:260
专家分:332
注 册:2011-4-7
收藏
得分:0 
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.TypeInitializationException: “SQLDAL.SqlDbHelper”的类型初始值设定项引发异常。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 SQLDAL.SqlDbHelper..cctor() 位置 E:\AddressList\AddressAndPhoneList\SQLDAL\SqlDbHelper.cs:行号 14
   --- 内部异常堆栈跟踪的结尾 ---
   在 SQLDAL.SqlDbHelper.ExecuteScalar(String commandText, CommandType commandType, SqlParameter[] parameters)
   在 SQLDAL.User.Login(String userName, String userPassword) 位置 E:\AddressList\AddressAndPhoneList\SQLDAL\User.cs:行号 28
   在 BLL.User.Login(String userName, String userPwd) 位置 E:\AddressList\AddressAndPhoneList\BLL\User.cs:行号 13
   在 WinForm.frmLogin.btnLogin_Click(Object sender, EventArgs e) 位置 E:\AddressList\AddressAndPhoneList\WinForm\frmLogin.cs:行号 36
   在 System.Windows.Forms.Control.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   在 System.Windows.Forms.Button.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 已加载的程序集 **************
mscorlib
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5466 (Win7SP1GDR.050727-5400)
    基本代码: file:///C:/Windows/
----------------------------------------
WinForm
    程序集版本: 1.0.0.0
    Win32 版本: 1.0.0.0
    基本代码: file:///E:/AddressList/AddressAndPhoneList/WinForm/bin/Debug/WinForm.exe
----------------------------------------
System.Windows.Forms
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5460 (Win7SP1GDR.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5466 (Win7SP1GDR.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5462 (Win7SP1GDR.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
BLL
    程序集版本: 1.0.0.0
    Win32 版本: 1.0.0.0
    基本代码: file:///E:/AddressList/AddressAndPhoneList/WinForm/bin/Debug/BLL.DLL
----------------------------------------
SQLDAL
    程序集版本: 1.0.0.0
    Win32 版本: 1.0.0.0
    基本代码: file:///E:/AddressList/AddressAndPhoneList/WinForm/bin/Debug/SQLDAL.DLL
----------------------------------------
System.Data
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_64/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
mscorlib.resources
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5466 (Win7SP1GDR.050727-5400)
    基本代码: file:///C:/Windows/
----------------------------------------
System.Windows.Forms.resources
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
    基本代码: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHS_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** JIT 调试 **************
要启用实时(JIT)调试,
该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
jitDebugging 值。
编译应用程序时还必须启用
调试。

例如:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

启用 JIT 调试后,任何无法处理的异常
都将被发送到在此计算机上注册的 JIT 调试器,
而不是由此对话框处理。

哪错了

☞  软件驱动整个世界 ☜
2012-12-30 15:34
跳过去
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:282
专家分:976
注 册:2012-8-13
收藏
得分:50 
会不会是啥命名空间没有引用啊

光棍中.....
2012-12-30 22:33
tianqy
Rank: 5Rank: 5
等 级:职业侠客
帖 子:260
专家分:332
注 册:2011-4-7
收藏
得分:0 
回复 3楼 跳过去
应该没有吧,除了SQLDA层其他不需要引用using System.Configuration;吧

☞  软件驱动整个世界 ☜
2012-12-31 08:31
剑傲
Rank: 2
等 级:论坛游民
帖 子:19
专家分:65
注 册:2008-10-17
收藏
得分:50 
这个错误还是自己调试好看一些!
  public static string ConnectionString
        {
            get { return connString; }
            set { connString = value; }
        }

我感觉这里的代码应该改为只读属性!
2013-01-01 01:30
剑傲
Rank: 2
等 级:论坛游民
帖 子:19
专家分:65
注 册:2008-10-17
收藏
得分:0 
以下是引用tianqy在2012-12-30 15:33:17的发言:

学习三层架构,遇到这个问题,代码检查了,应该没有问题,层之间的映射关系也对着,求助:
 
SqlhelperDB.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
 
namespace SQLDAL
{
    ///针对SQL Server数据库操作的通用类:
    public class SqlDbHelper
    {
        private static string connString =
              ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        public static string ConnectionString
        {
            get { return connString; }
            set { connString = value; }
        }
 
        //编写ExecuteDataTable方法,对数据库进行非连接式查询操作:
        public static DataTable ExecuteDataTable(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            DataTable data = new DataTable();
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(commandText, conn))
                {
                     = commandType;
                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(data);
                }
            }
            return data;
        }
        //继续编写俩个重载的ExecuteDataTable方法:
        public static DataTable ExecuteDataTable(string commandText)
        {
            return ExecuteDataTable(commandText, CommandType.Text, null);
        }
        public static DataTable ExecuteDataTable(string commandText, CommandType commandType)
        {
            return ExecuteDataTable(commandText, commandType, null);
        }
 
        //编写ExecuteReader方法,对数据库进行连接式查询:
        public static SqlDataReader ExecuteReader(string commandText, CommandType commandType, SqlParameter[] parameters)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(commandText, conn);
             = commandType;
            if (parameters != null)
            {
                foreach (SqlParameter param in parameters)
                {
                    cmd.Parameters.Add(param);
                }
            }
            conn.Open();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        //继续编写俩个重载ExecuteReader方法
        public static SqlDataReader ExecuteReader(string commandText)
        {
            return ExecuteReader(commandText, CommandType.Text, null);
        }
        public static SqlDataReader ExecuteReader(string commandText, CommandType commandType)
        {
            return ExecuteReader(commandText, commandType, null);
        }
 
      
继续建议楼主,SqlParameter[] parameters,这里用可变参数就行了,不用那么多重载!
2013-01-01 10:47
tianqy
Rank: 5Rank: 5
等 级:职业侠客
帖 子:260
专家分:332
注 册:2011-4-7
收藏
得分:0 
回复 6楼 剑傲
重载是想留着以后扩展用,写全。可是为什么读不到数据库的内容呢

☞  软件驱动整个世界 ☜
2013-01-02 16:38
tianqy
Rank: 5Rank: 5
等 级:职业侠客
帖 子:260
专家分:332
注 册:2011-4-7
收藏
得分:0 
哈哈哈  解决了,谢谢各位,原来我把配置文件写错地方了,应该写在winform里面,我写到sqlDal层了,罪过。

☞  软件驱动整个世界 ☜
2013-01-02 16:45
快速回复:学习三层架构,遇到个问题,求助大牛们
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.079654 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved