我可以在应用程序中多次使用相同的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

我可以在应用程序中多次使用相同的SQL连接字符串吗

是的,如果是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.configapp.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.ConfigWeb.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。解决方法:

  1. 右键单击解决方案资源管理器中的引用
  2. 单击"添加引用"
  3. 查找并添加System.Configuration.dll