【问题标题】:How to create connection string using parameter C#如何使用参数 C# 创建连接字符串
【发布时间】:2014-06-25 04:23:08
【问题描述】:

我是新手。对不起!

我的 Windows 窗体应用程序有 3 层。演示文稿具有带有 textEdit_Name 和 textEdit_Pass 的 Form_Login。

我的连接类:

public class _Connection
{
    public OleDbConnection GetConn(string _name, string _pass)
    {
        OleDbConnection _Conn = new OleDbConnection(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User ID={1};Password={2};", @"C:\Test\Test.mdb", _name, _pass));
        return _Conn;
    }
}

我的数据访问层:

public class getDAL : IDisposable
{
    private _Connection getConn = new _Connection();
    OleDbConnection _Conn = new OleDbConnection();
    public DataTable getDatatable()
    {
        _Conn = getConn.GetConn();
        //Do something
    }
}

我怎样才能得到 _Conn:

_name = textEdit_Name.Text 和 _pass = textEdit_Pass.Text

当用户通过 Form_Login 登录时

【问题讨论】:

  • 你是在业务层还是表现层创建 DAL 的实例?
  • 我是在业务层做的。
  • 这意味着在 Form_Login 中创建业务层实例,然后在业务层中创建 DAL 实例?如果是,则必须将您的 namepass 传递给其他层。
  • 看看OleDbConnectionStringBuilder 类 - 这可以帮助您非常轻松地创建有效的连接字符串

标签: c# string class connection layer


【解决方案1】:

也许最简单的方法是在 DAL 的静态类中设置 ConnectionString 详细信息。像这样的:

public static class ConnectionDetails
{
    public static string UserName;
    public static string Password;

    public static string GetAccessConnectionString(string filepath)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", filepath);
        if (string.IsNullOrEmpty(UserName) || string.IsNullOrEmpty(Password))
            sb.Append("User Id=admin;Password=;");
        else
            sb.AppendFormat("User Id={0};Password={1};", UserName, Password);

        return sb.ToString();
    }
}

您的业务层需要设置 ConnectionDetails 静态类的 UserNamePassword 字段,只要它们在您的表示层中发生更改,并且需要连接字符串的 DAL 类应该通过调用 ConnectionDetails.GetAccessConnectionString 来获取它们适当的文件路径。或者将 FilePath 添加为该类中的静态字段之一,以便您可以从任何地方设置所有三个。

如果您打算使用多个数据库文件,那么以文件名为关键字的连接数据字典可能是个好主意。

【讨论】:

  • ConnectionStringBuilder 是你想要的。
  • @HackSlash 是的,是的。但我确实是在 4 年前写的。从那以后我就继续前进了。
【解决方案2】:

您可以使用 ConnectionStringBuilder 类

public static class BuildConnection()
{    
    public static GetConnectionString(var userName, var Password)
    {
          OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
          builder.Driver = "Microsoft Access Driver (*.mdb)";        
          builder.Add("Dbq", @"C:\Test\Test.mdb");
          builder.Add("User Id", userName);
          builder.Add("Password", Password);
          return builder.ConnectionString; // Here is your connection String 
    }
}

【讨论】:

    【解决方案3】:

    以下是如何将LoginForm TextBox .Text 传递到业务层和数据访问层的示例。

    数据访问层

    class DALClass : IDisposable
    {
        private _Connection getConn;
        OleDbConnection _Conn;
    
        public DALClass()
        {
             getConn = new _Connection();
        }
    
        public DataTable getDatatable(string sUserName, string sUserPass)
        {
            //pass on user name and password
            _Conn = getConn.GetConn(sUserName, sUserPass);
            //Do something
    
            return default(DataTable);  //return datatable 
        }
    }
    
    public class _Connection
    {
        public OleDbConnection GetConn(string _name, string _pass)
        {
            OleDbConnection _Conn = new OleDbConnection(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User ID={1};Password={2};", @"C:\Test\Test.mdb", _name, _pass));
            return _Conn;
        }
    }
    

    业务层

    class BLClass
    {
        DALClass _dal;       
    
        public BLClass()
        {
            _dal = new DALClass();            
        }
    
        public DataTable GetDataTable(string sUserName, string sUserPass)
        {
            return _dal.getDatatable(sUserName, sUserPass);
        }
    }
    

    登录表单

     public partial class LoginForm : Form
     {
        BLClass _bl;
    
        public LoginForm()
        {
            InitializeComponent();
            //object of business layer
            _bl = new BLClass();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {    
            //pass text boxes values to Business Layer      
            DataTable dt = _bl.GetDataTable(textEdit_Name.Text, textEdit_Pass.Text);            
        }
     }
    

    【讨论】:

    • 不,它不起作用... bl.sUserName 和 _bl.sUserPass 在运行以获取连接字符串时为空
    • @Camambeou。对不起,我错过了一些明显的东西。你能检查我更新的代码吗?
    • 感谢您的创意。但它仍然无法正常工作。我不知道为什么。我认为当我们调用类时调用一个新类,所以参数也是新的(获取默认值
    • 业务类和dal访问的实例在各自的构造函数中调用一次。注意LoginForm()构造函数BLClass实例_bl被实例化了。
    • 我卡住了,字符串 _name 和 _pass 总是为 null 并且应用程序抛出错误“无效的用户名或密码”...你知道吗?!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2017-03-07
    • 2021-11-25
    • 2020-01-23
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多