C# 空连接字符串仍在打开,没有错误
我最近将一个Delphi应用程序转换为C#,我遇到了一个SQL连接问题。出于某种原因,在调用C# 空连接字符串仍在打开,没有错误,c#,sql,sql-server,connection-string,C#,Sql,Sql Server,Connection String,我最近将一个Delphi应用程序转换为C#,我遇到了一个SQL连接问题。出于某种原因,在调用CheckConnection函数(如下所示)时,如果我的连接字符串参数为空,则连接仍然能够.Open()无错误。为什么会这样?我觉得我的CheckConnection函数有问题,或者我不了解.Open()的实际工作原理 如何设置-有些文本框包含主机名、用户等,用作连接字符串的参数。正确填写这些参数后,一切正常,但当参数(即文本框)全部留空时,连接仍然打开 String hostname, user, p
CheckConnection
函数(如下所示)时,如果我的连接字符串
参数为空,则连接仍然能够.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};" />
那应该不能打开,对吗?但是它确实会这样做,而且只有在使用sqlserver
时,MySQL
才会正确地抛出错误
编辑:
好的,结果表明,仅当我对以下连接字符串使用SQL Server windows身份验证时,才会引发错误:
<add name="MSSQL_WA" providerName="System.Data.SqlClient" connectionString="Data Source={0}; Initial Catalog={1}; Integrated Security=SSPI;"/>
通过调试,数据源和初始目录为空,但连接仍然打开。不确定这是为什么?您可以添加一个包含空参数的字符串示例,还是说一个空字符串“”?完成!是的,空参数,字符串本身不是空的。。主机名、端口、数据库和用户来自何处,您不会显示它们被设置为任何东西对不起,我在代码中的注释中放了它,应该放得更清楚。它们由文本框设置。我将更新问题。
newsqlconnection(“integratedsecurity=True”).Open()代码>在这里对我有效,可能是因为我有一个默认实例(即“本地”)
<add name="MSSQL_WA" providerName="System.Data.SqlClient" connectionString="Data Source={0}; Initial Catalog={1}; Integrated Security=SSPI;"/>