我可以在应用程序中多次使用相同的SQL连接字符串吗
本文关键字:SQL 连接 字符串 应用程序 我可以 | 更新日期: 2023-09-27 18:29:17
我是SQL的新手。我正在使用C#构建应用程序,它使用本地SQL Server读取/写入数据。我只有一个数据库,当我连接到SQL Server时,连接字符串总是相同的。
在我的项目应用程序中,我有9个windows表单,每个表单都使用相同的连接字符串,在某些表单中,我多次使用同一连接。我可以在同一表单中多次使用同一连接字符串吗?谢谢
这是连接字符串:
SqlConnection cn = new SqlConnection(@"Data Source=localhost; AttachDbFilename=E:'myDB'DB1.mdf; trusted_connection=yes
是的,如果是windows窗体应用程序,您可以将其存储在web.config文件或app.config文件中,然后重新使用
System.Configuration.ConfigurationManager.
ConnectionStrings["connectionStringName"].ConnectionString;
其中connectionStringName是存储在web.config文件中的连接字符串的名称
您可以对所有数据操作使用一个连接,但更好的方法是从表单中删除所有数据操作,并将这些操作放在处理数据操作的类中。此外,我还建议在每个方法连接共享连接字符串的情况下,为每个方法使用一个连接。下面是我为MSDN编写的一个代码示例。请注意,每个方法连接都不是共享的,它是方法的本地连接,并且使用了一个using语句,该语句将在完成时关闭连接。简单地说,重复使用一个连接的应用程序是可以的,但一旦与许多用户一起使用更复杂的应用程序时,请考虑节省资源,并使连接打开的时间只够进行预期操作。
概念示例。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace DataOperations_cs
{
public class BackendOperations
{
public string ConnectionString { get; set; }
public DataTable DataTable { get; set; }
public List<string> ContactTitles { get; set; }
public Exception Exception { get; set; }
public bool HasException
{
get
{
return this.Exception != null;
}
}
public bool RetrieveAllRecords()
{
this.DataTable = new DataTable();
try
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.[SelectAllCustomers]" })
{
try
{
cn.Open();
}
catch (SqlException sqlex)
{
if (sqlex.Message.Contains("Could not open a connection"))
{
this.Exception = sqlex;
return false;
}
}
this.DataTable.Load(cmd.ExecuteReader());
}
}
if (ContactTitles == null)
{
RetrieveContactTitles();
}
this.Exception = null;
return true;
}
catch (Exception ex)
{
this.Exception = ex;
return false;
}
}
public bool RetrieveAllRecordsbyContactTitle(string contactType)
{
this.DataTable = new DataTable();
try
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.ContactByType" })
{
cmd.Parameters.Add(new SqlParameter { ParameterName = "@ContactTitleType", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters["@ContactTitleType"].Value = contactType;
cn.Open();
this.DataTable.Load(cmd.ExecuteReader());
}
}
this.Exception = null;
return true;
}
catch (Exception ex)
{
this.Exception = ex;
return false;
}
}
public bool RetrieveContactTitles()
{
if (ContactTitles != null)
{
return true;
}
try
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.[SelectContactTitles]" })
{
cn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
this.ContactTitles = new List<string>();
while (reader.Read())
{
this.ContactTitles.Add(reader.GetString(0));
}
}
}
}
this.Exception = null;
return true;
}
catch (Exception ex)
{
this.Exception = ex;
return false;
}
}
public int AddCustomer(string CompanyName, string ContactName, string ContactTitle)
{
try
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.InsertCustomer" })
{
cmd.Parameters.Add(new SqlParameter { ParameterName = "@CompanyName", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@ContactName", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@ContactTitle", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@Identity", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output });
cmd.Parameters["@CompanyName"].Value = CompanyName;
cmd.Parameters["@ContactName"].Value = ContactName;
cmd.Parameters["@ContactTitle"].Value = ContactTitle;
cn.Open();
var affected = cmd.ExecuteScalar();
this.Exception = null;
return Convert.ToInt32(cmd.Parameters["@Identity"].Value);
}
}
}
catch (Exception ex)
{
this.Exception = ex;
return -1;
}
}
public bool RemoveCustomer(int Indentifier)
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.[DeleteCustomer]" })
{
cmd.Parameters.Add(new SqlParameter { ParameterName = "@Identity", SqlDbType = SqlDbType.Int });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@flag", SqlDbType = SqlDbType.Bit, Direction = ParameterDirection.Output });
cmd.Parameters["@Identity"].Value = Indentifier;
cmd.Parameters["@flag"].Value = 0;
try
{
cn.Open();
var affected = cmd.ExecuteNonQuery();
this.Exception = null;
if (Convert.ToBoolean(cmd.Parameters["@flag"].Value))
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
this.Exception = ex;
return false;
}
}
}
}
public bool UpdateCustomer(int PrimaryKey, string CompanyName, string ContactName, string ContactTitle)
{
try
{
using (SqlConnection cn = new SqlConnection { ConnectionString = this.ConnectionString })
{
using (SqlCommand cmd = new SqlCommand { Connection = cn, CommandType = CommandType.StoredProcedure, CommandText = "dbo.[UpateCustomer]" })
{
cmd.Parameters.Add(new SqlParameter { ParameterName = "@CompanyName", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@ContactName", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@ContactTitle", SqlDbType = SqlDbType.NVarChar });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@Identity", SqlDbType = SqlDbType.Int });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@flag", SqlDbType = SqlDbType.Bit, Direction = ParameterDirection.Output });
cmd.Parameters["@CompanyName"].Value = CompanyName;
cmd.Parameters["@ContactName"].Value = ContactName;
cmd.Parameters["@ContactTitle"].Value = ContactTitle;
cmd.Parameters["@Identity"].Value = PrimaryKey;
cmd.Parameters["@flag"].Value = 0;
cn.Open();
var affected = cmd.ExecuteNonQuery();
this.Exception = null;
if (Convert.ToBoolean(cmd.Parameters["@flag"].Value))
{
return true;
}
else
{
return false;
}
}
}
}
catch (Exception ex)
{
this.Exception = ex;
return false;
}
}
}
}
当然可以,最好的方法是在web.config
或app.config
中定义连接字符串,然后像一样将它们读取到应用程序中
System.Configuration.ConfigurationManager.ConnsectionStrings["CS"].ConnestionString
<connectionStrings>
<add name="CS" connectionString="Data Source=localhost; AttachDbFilename=E:'myDB'DB1.mdf; trusted_connection=yes" providerName="Sysem.Data.SqlClient"/>
</connectionStrings>
后面有一个非常智能的机制:连接池。连接将在一段时间内保持可用。如果您再次需要连接,并且传入了完全相同的连接字符串(区分大小写),则会重复使用相同的连接。
这意味着:
- 是的,您可以在应用程序中使用一个"全局"连接
- 在大多数情况下不会有什么不同:-)
可以。尽管如此,您可能需要考虑不必一直重复代码的方法,这样,如果连接字符串发生更改,您只需要更改一次,而不需要更改几次。一种方法是将连接字符串保存在配置文件中。您可以有一个带有连接字符串的类的静态实例,或者一个简单的连接工厂。
public static class ConnectionFactory{
private static string connectionString = "connection string"; //You could get this from config file as other answers suggest.
public static SqlConnection GetConnection(){
return new SqlConnection(connectionString);
}
}
未经测试,因此可能存在一些语法错误。
这是最好的策略:
在您的应用程序中,使用getConnection方法创建一个静态类
public class StaticContext
{
public static SqlConnection getConnessione()
{
string conn = string.Empty;
conn = System.Configuration.ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString;
SqlConnection aConnection = new SqlConnection(conn);
return aConnection;
}
}
在每个表单中,当您需要连接时,使用以下方式:
try
{
try
{
conn = StaticContext.getConnessione();
SqlCommand aCommand = new SqlCommand("SELECT.....", conn);
conn.Open();
aReader = aCommand.ExecuteReader();
while (aReader.Read())
{
//TODO
}
}
catch (Exception e)
{
Console.Write(e.Message);
}
}
finally
{
conn.Close();
}
您要做的是将连接字符串添加到项目解决方案中的App.Config或Web.Config(取决于您的项目类型)文件中。它可能看起来像这样:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="MyConnection"
connectionString="Data Source=localhost; AttachDbFilename=E:'myDB'DB1.mdf; trusted_connection=yes"/>
</connectionStrings>
</configuration>
接下来你应该包括以下参考:
using System.Configuration;
现在你可以得到你的字符串如下:
string connectionString = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
即使在代码中使用System.Configuration;
,也可能找不到ConfigurationManager
。解决方法:
- 右键单击解决方案资源管理器中的引用
- 单击"添加引用"
- 查找并添加
System.Configuration.dll