标签: sqlconnection

是否会通过GC处理SqlConnection?

免责声明:我知道IDisposable在处理非托管资源时应该实施.其余的代码应该是确定性的,并且using (...) { }(相当于try {} finally { Dispose(); })保证尽快清理.此外,GC 不会调用Dispose(),因此推荐的模式是覆盖Finalize()随后调用的方法(使用析构函数语法在C#中)Dispose().GC通常会调用Finalize()(除非GC.SuppressFinalize()被调用).

问题:所以现在我已经解决了这个问题,我有一个奇怪的场景,using (SqlConnection...) { }由于我无法控制代码,我无法做到这一点.我通常可以做一个确定性的Dispose(),但不能保证.我使用Reflector进行反汇编SqlConnection并看到它使用Dispose(),但除非我是盲目的,否则没有终结器/析构函数(Finalize()~SqlConnection()).这是否意味着GC不会"清理"(发送回池)连接在奇怪的情况下我不能?我找不到任何确定的东西......

.net idisposable sqlconnection finalizer

13
推荐指数
1
解决办法
3065
查看次数

Connection.open无限期挂起,不会抛出任何异常

当我尝试执行以下代码时,程序将无限期挂起.我不知道为什么,似乎还有其他未解答的话题.虽然,如果无法访问IP \网站,那么它按预期工作.

    private void DoStuff()
    {
        string connectionString = "Data Source=www.google.com;Connection Timeout=5";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open(); //Hangs here indefinitely
            Console.WriteLine("Test");
        }
    }
Run Code Online (Sandbox Code Playgroud)

例如,如果我将连接字符串设置为

connectionString = "Data Source=www.nonexistentsite.com;Connection Timeout=5";

然后它会抛出异常.如何让它为活动站点抛出异常?... 显然,谷歌只是出于测试目的.

编辑:

如果我尝试连接到无法访问的服务器名称或IP地址,我收到此异常...

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: …

c# database database-connection sqlconnection connection-timeout

13
推荐指数
1
解决办法
6874
查看次数

打开SQL连接时出现算术溢出异常

ArithmeticOverflowException打开与底层SQL数据库的SQL连接时,我非常奇怪(下面包含堆栈跟踪).使用哪个版本的服务器并没有什么区别(我已经验证了MS SQL 2005/2008/2012/2014),错误仍然是相同的.安装了Windows Update的所有最新更新和修补程序.操作系统是Windows 8.1/10(两个系统都相同).服务器在本地安装,并通过用户和密码建立连接.连接超时验证范围为15到1000秒.

最令人惊讶的是应用程序工作正常,并与服务器正常通信,执行许多不同的查询,但突然发生此异常.我注意到这个异常在一些Windows更新后开始显示(不知道哪一个).

我查看了.NET代码,但不知道是什么原因会导致算术溢出异常......

- 堆栈跟踪 -

in SNIOpenSyncExWrapper(SNI_CLIENT_CONSUMER_INFO* , SNI_ConnWrapper** )
in SNINativeMethodWrapper.SNIOpenSyncEx(ConsumerInfo consumerInfo, String constring, IntPtr& pConn, Byte[] spnBuffer, Byte[] instanceName, Boolean fOverrideCache, Boolean fSync, Int32 timeout, Boolean fParallel)
in System.Data.SqlClient.SNIHandle..ctor(ConsumerInfo myInfo, String serverName, Byte[] spnBuffer, Boolean ignoreSniOpenTimeout, Int32 timeout, Byte[]& instanceName, Boolean flushCache, Boolean fSync, Boolean fParallel)
in System.Data.SqlClient.TdsParserStateObject.CreatePhysicalSNIHandle(String serverName, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Byte[]& instanceName, Byte[] spnBuffer, Boolean flushCache, Boolean async, Boolean fParallel)
in System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sqlconnection windows-8.1

13
推荐指数
2
解决办法
7966
查看次数

处理数据库连接问题的正确方法

我在尝试连接数据库时遇到以下错误:

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

现在有时我得到这个错误,有时我不这样做,例如:当我第一次运行我的程序时,它成功打开连接,当我第二次运行时,我得到这个错误,下次我再次运行我的程序然后我不会得到错误.

当我尝试通过SSMS连接到同一个数据库服务器,然后我能够成功连接,但我只在我的程序中遇到此网络问题.

数据库不在我的LOCAL中.它在AZURE上.

我的本地数据库没有出现此错误.

代码:

public class AddOperation
{
    public void Start()
    {
          using (var processor = new MyProcessor())
          {
              for (int i = 0; i < 2; i++)
              {
                  if(i==0)
                  {
                     var connection = new SqlConnection("Connection string 1");
                     processor.Process(connection);
                  }
                  else
                  {
                      var connection = new SqlConnection("Connection string 2");
                      processor.Process(connection);
                  }   
              }
          }
    }       
}

public class MyProcessor : IDisposable
{
    public void Process(DbConnection cn)
        {
            using (var …
Run Code Online (Sandbox Code Playgroud)

c# ado.net sqlconnection azure-sql-database

13
推荐指数
3
解决办法
1974
查看次数

如何在web.config文件中编写连接字符串并从中读取?

我正在尝试将连接字符串写入Web.config,如下所示:

<connectionStrings>
  <add name="Dbconnection" connectionString="Server=localhost; 
       Database=OnlineShopping ; Integrated Security=True"/>
</connectionStrings >
Run Code Online (Sandbox Code Playgroud)

并从中读取如下:

string strcon = 
    ConfigurationManager.ConnectionStrings["Dbconnection"].ConnectionString;
SqlConnection DbConnection = new SqlConnection(strcon);
Run Code Online (Sandbox Code Playgroud)

当运行程序时,由于空引用,我得到一个错误.但是当我使用这段代码时:

SqlConnection DbConnection = new SqlConnection();
DbConnection.ConnectionString = 
    "Server=localhost; Database=OnlineShopping ; Integrated Security=True";
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,程序正常工作!问题是什么?

c# asp.net sqlconnection

12
推荐指数
3
解决办法
18万
查看次数

在.NET中的动态SQL中清理表/列名称?(防止SQL注入攻击)

我正在生成一些动态SQL,并希望确保我的代码是安全的SQL注入.

为了争论,这里是一个如何生成它的最小例子:

var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
    tableName, columnName);
Run Code Online (Sandbox Code Playgroud)

在上面,tableNamecolumnName,以及@value来自不受信任来源的任何内容.由于占位符的使用@value是安全的SQL注入攻击,可以忽略.(该命令通过SqlCommand执行.)

但是,tableName并且columnName 不能作为占位符绑定,因此容易受到注入攻击.由于这是一个"真正动态"的场景,因此没有白名单tableNamecolumnName可用.

问题是:

是否有一个标准的,内置的方式来检查和/或消毒tableNamecolumnName?(SqlConnection,或帮助程序类等)如果没有,在使用第三方库的情况下执行此任务的好方法是什么?

笔记:

  • 所有SQL标识符,包括模式,都应该被接受:例如[schema].[My Table].column,就像"安全"一样table1.
  • 可以清理标识符或检测无效标识符.(它不需要确保表/列在上下文中实际有效;生成的SQL可能无效,但必须是"安全的".)

更新:

刚发现这个,并认为它有点有趣:.NET4中有一个SqlFunctions.QuoteName函数(EF4?).好的,这对我来说真的没有帮助......

.net sql sanitization sqlconnection dynamic-sql

11
推荐指数
2
解决办法
4929
查看次数

最有效的方法来测试SQL连接字符串的可用性

我有这个代码,我试图让它测试SQL字符串连接,但我不知道如何处理该部分connection.Open = true你能帮我解决这个问题吗?非常感谢您的参与.

  private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection("Data Source='" + textBox1.Text + "';Initial Catalog='" + textBox2.Text + "';User ID='" + textBox3.Text + "';Password='" + textBox4.Text + "'"))
            {
                try
                {
                    connection.Open();
                    if (connection.Open == true) // if connection.Open was successful
                    {
                        MessageBox.Show("You have been successfully connected to the database!");
                    }
                    else
                    {
                        MessageBox.Show("Connection failed.");
                    }
                }
                catch (SqlException) { }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Chyba v …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server sqlconnection

11
推荐指数
1
解决办法
5万
查看次数

重用SqlConnection的最佳实践

我来自Java经验,我试图从C#开始.我已经阅读了SqlConnection SqlCommand SqlDataReader IDisposable,我可以理解连接到数据库的最佳做法是包装SqlConnection,SqlCommandSqlDataReader在他们自己的using块中.

但在Java中,我们使用将连接封装到工厂方法中,只创建一次,并将其重用于所有查询,甚至是多线程查询.仅为每个查询创建语句和结果集,并尽快关闭.

是不是SqlConnection为每个查询创建一个新的有点矫枉过正?不能重复使用吗?

.net c# connection-pooling idisposable sqlconnection

11
推荐指数
3
解决办法
2万
查看次数

什么时候调用DbConnection.StateChange?

我有以下代码:

   class Program
{
    static void Main()
    {
        var connection = new SqlConnection("myConnectionString");
        connection.Open();
        connection.StateChange += HandleSqlConnectionDrop;
        Console.WriteLine("Hi");
        Console.ReadLine();
    }

    private static void HandleSqlConnectionDrop(object connection, StateChangeEventArgs args)
    {
        Console.WriteLine("DB change detected");
    }
}
Run Code Online (Sandbox Code Playgroud)

我在SQL服务器实例运行时启动上面的代码.然后我继续执行

SHUTDOWN WITH NOWAIT;
Run Code Online (Sandbox Code Playgroud)

在程序连接到的SQL Server实例上.然后我观察SQL服务器服务停止.但是,我从未在输出中看到"检测到DB更改"消息.为什么是这样?

旁白:如果我然后尝试对SQL连接执行操作,我将看到调用StateChange处理程序,但从未提前.有没有办法可以改变这种行为?

c# sql-server sqlconnection

11
推荐指数
2
解决办法
2238
查看次数

发布期间未复制数据库文件,因此安装的应用程序会引发异

我正在开发一个包含基于服务的数据的C#窗体应用程序.当我测试我的应用程序时,它的数据库工作正常但在程序尝试打开sqlconnection后发布和安装程序后,出现此错误:

System.Data.SqlClient.SqlException(0x80131904):尝试为文件C:\ Users\Behnam\AppData\Local\Apps\2.0\Data\5XVOVXV1.3VG\M5T04ZK7.QBJ\tahl附加自动命名的数据库. tion_45c3791d6509222d_0001.0000_be1c7cc05811ecf0\Data\AppData\TahlilGar.mdf失败.存在具有相同名称的数据库,或者无法打开指定的文件,或者它位于UNC共享上.

这是我的ConnectionString:

<add name="BA" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\AppData\TahlilGar.mdf;
Integrated Security=True;"providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

我也尝试过:User Instance= True;但结果是:

连接到SQL Server的用户实例时,不允许用户实例登录标志.连接将被关闭.

我该如何解决这个问题?


编辑:我检查了提到的路径,但没有我的.mdf文件.所以我从我的项目中复制了它,之后它工作得很好.现在为什么我的mdf文件在预期路径中发布和安装时没有复制.

c# connection-string app-config sqlconnection local-database

10
推荐指数
1
解决办法
638
查看次数