空连接字符串仍然打开没有错误

时间:2016-04-18 11:50:34

标签: c# sql sql-server connection-string

我最近将Delphi应用程序转换为C#,我遇到了SQL连接问题。出于某种原因,在调用CheckConnection函数(如下所示)时,如果我的connection string具有空参数,则连接仍然可以.Open()没有错误。为什么是这样?我觉得我的CheckConnection函数有问题,或者我可能不理解.Open()实际上是如何工作的。

如何设置 - 有一些文本框包含主机名,用户等,它们用作连接字符串的参数。当这些参数正确填写时,一切正常,但当参数(也就是文本框)全部留空时,连接仍会打开。

String hostname, user, password, database, protocol, query;
string connString;
IDbConnection SqlConn;
DbProviderFactory factory;    

    public void SetConnectionParams()
    {
        hostname = ServerTextBox.Text.Trim();
        port = StrToIntDef(PortTextBox.Text, 3306);
        user = UserIDTextBox.Text;
        password = PasswordTextBox.Text;
        database = DBTextBox.Text;
        protocol = ProtocolTextBox.Text; //MIGHT not need

        GetConnectionString(); //Get the correct connection string
    } 

    //Gets the connection string from app.config
    //The parameters for the string are all set via textboxes in diff. part of code
    public void GetConnectionString()
    {
        if (MySqlRB.IsChecked == true) //Sets up connection for MySQL
        {
            var cs = ConfigurationManager.ConnectionStrings["MySQL"];
            connString = ConfigurationManager.ConnectionStrings["MySQL"].ToString();
            factory = DbProviderFactories.GetFactory(cs.ProviderName);
            connString = String.Format(connString, hostname, port, database, user, password);
        }
        else //Sets up connection for MS SQL
        {
            if (WindowsAuth.IsChecked == true) //If windows authentication checkbox is checked
            {
                var cs = ConfigurationManager.ConnectionStrings["MSSQL_WA"];
                connString = ConfigurationManager.ConnectionStrings["MSSQL_WA"].ToString();
                factory = DbProviderFactories.GetFactory(cs.ProviderName);
                connString = string.Format(connString, hostname, database);
            }
            else //don't use windows authentication
            {
                var cs = ConfigurationManager.ConnectionStrings["MSSQL"];
                connString = ConfigurationManager.ConnectionStrings["MSSQL"].ToString();
                factory = DbProviderFactories.GetFactory(cs.ProviderName);
                connString = string.Format(connString, hostname, database, user, password);
            }
        }
    }

    //Supposed to check if the connection works or not
    //This is working even if the connection string has empty parameters
    public Boolean CheckConnection(bool check)
    {
        try
        {
            if (!CloseFirst && (SqlConn.State != System.Data.ConnectionState.Open))
            {
                return false;
            }
            else
            {
                using (SqlConn = factory.CreateConnection()) //make the connection
                {
                    SqlConn.Close(); //make sure it's closed first just in case 
                    SqlConn.ConnectionString = connString;
                    SqlConn.Open(); // Open the connection

                    if (SqlConn.State == System.Data.ConnectionState.Open)
                    {
                        SqlConn.Close();
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
        catch
        {
            return false;
        }
    }

示例:这是一个连接字符串,位于我的app.config中,用于sql server字符串:

<add name="MSSQL" providerName="System.Data.SqlClient" 
          connectionString="Data Source={0}; Initial Catalog={1}; User={2}; Password={3};" />

通过程序调试时,如果我没有设置任何参数,字符串会这样:

connString = "Data Source=; Initial Catalog=; User=; Password=;"

那不应该打开吧?但它确实如此,只有在使用SQL Server时,MySQL才会正确地抛出错误。

编辑:

好的,仅当我使用此连接字符串使用SQL Server Windows身份验证时,才会抛出错误:

<add name="MSSQL_WA" providerName="System.Data.SqlClient" connectionString="Data Source={0}; Initial Catalog={1}; Integrated Security=SSPI;"/>

调试通过,数据源和初始目录为空,但连接仍然打开。不知道为什么会这样?

0 个答案:

没有答案
相关问题