SQL Server Connection Timeout C# - c#

First off I'd like to let everyone know I have searched my particular problem and can't seem to find what's causing my problem.
I have an SQL Server 2008 instance running on a network machine and a client I have written connecting to it.
To connect I have a small segment of code that establishes a connection to an sql server 2008 instance and returns a DataTable populated with the results of whatever query I run against the server, all pretty standard stuff really. Anyway the issue is, whenever I open my program and call this method, upon the first call to my method, regardless as to what I've set my Connection Timeout value as in the connection string, it takes about 15 seconds and then times out. Bizarrely though the second or third call I make to the method will work without a problem.
I have opened up the ports for SQL Server on the server machine as outlined in this article: How to Open firewall ports for SQL Server and verified that it is correctly configured. Can anyone see a particular problem in my code?
string _connectionString = "Server=" + #Properties.Settings.Default.sqlServer + "; Initial Catalog=" + #Properties.Settings.Default.sqlInitialCatalog +
";User Id=" + #Properties.Settings.Default.sqlUsername + ";Password=" + #Properties.Settings.Default.sqlPassword + "; Connection Timeout=1";
private DataTable ExecuteSqlStatement(string command)
{
using (SqlConnection conn = new SqlConnection(_connectionString))
{
try
{
conn.Open();
using (SqlDataAdapter adaptor = new SqlDataAdapter(command, conn))
{
DataTable table = new DataTable();
adaptor.Fill(table);
return table;
}
}
catch (SqlException e)
{
throw e;
}
}
}
The SqlException that is caught at my catch is : "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."
This occurs at the conn.Open(); line in the code snippet I have included. If anyone has any ideas that'd be great!
Addendum If I ping the server it's <10ms response time. Additionally I'm getting the same behavior when using SQL Server Management studio (I've just tried this after writing this question as the thought just crossed my mind). I would presume that this has to be a network issue as opposed to a code issue as it also takes two attempts when using SQL Server Management studio. I realise I can implement an error check for connection failure and then re-attempt the connection (I should probably do this anyway) but this doesn't seem particularly 'clean' to me as it doesn't address the underlying problem. Does anyone here have any experience with this issue?
Edit
Although over a year later this question has been viewed over 4000 times, I've since discovered that although I /thought/ the firewall ports were opened, they actually weren't. I'd incorrectly assumed that you need to open the firewall in Windows to the port number that SQL Server uses, in my case I set it to allow connections on TCP port 1433, the firewall caused issues when attempting to establish an initial connection.
I discovered that the correct way to set it up was to set Windows Firewall to allow the SQL Server Instance executable through. To do this you need Add a Program in Windows Firewall, browse to the folder your sql instance resides in such as C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLINSTANCE\MSSQL\Binn and then add the sqlservr.exe file to the firewall rules.

You are setting the connection timeout value to 1 second. Drop it from connection string and try again.
Or the problem could be with the SQL select you are using. Could it be taking a long time. If so, the 2nd and 3rd calls would retrieve the cached values and thus run much quicker.

Related

Instance failure when connection to DB through C# code

I am getting this error while connecting to database , though this error is not seen everytime.
The connection string in c# is as follows,
"Data Source=" + machineName + "\\" + instance + ";Initial
Catalog=dbName;Integrated Security=True";
When i narrowed down the exact place the exception is thrown, it happens to be when database connection open is attempted.
DBConnection.con.Open();
This issue is not reproducible consistenly.
I searched alot and was not able to figure out why this was happenend.I verified the suggestion that was shared,
Verified that instance being used and SQL service is up and running.
TCP/IP is enabled and remote connections are allowed.
Checked the SQL error logs and couldn't figure out anything wrong there.
The connection string has proper format of machinename\instance .
I also restarted the SQL service mutliple times but no luck with that too. I am stuck and do not know how to proceed forward.
Any suggestion is most welcome.
Try connecting to your database from Visual Studio (SQL Server Explorer). Once successful, right-click on the server instance, copy the connection string. Like this, you are sure about the syntax. A database connection is meant to be on a local network. If you connect to a database over internet, implement a webservice.
Have fun :)

Error occurred during the pre-login handshake

Please read in the entirety before marking this as duplicate.
In a project that I am debugging I receive a SqlException saying the following:
Additional information: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 0 - The wait operation timed out.)
This occurred during a debugging session where the previous session executed only seconds before without problem. Since the initial exception, I am unable to connect to the database server in this project. The exception is thrown on the SqlConnection.Open() method call.
The Background
This is not the first time that I have received this. Previously I struggled with it for two weeks eventually initiating a Microsoft support ticket for it. In that instance it turned out the ApplicationName property on the connection string was too long (we were using the fully qualified assembly name) and shortening it alleviated the problem.
This time around, there is
No ApplicationName value supplied
WinSocks is in its default state
Antivirus (ESET) was disabled and was not the issue.
Nothing was installed between a working and non-working debug session
Finally, on a whim, I created a new project whose sole purpose was to connect to this same SQL server. I copied the connection string from the non-working project, into the new project and it connects. Is there some kind of per-project connection caching going on? Something that survives a Clean>Rebuild and a restart of Visual Studio and Windows too?
Relevant Code
public SqlConnection OpenSqlConnection(string connectionString)
{
var conn = new SqlConnection(connectionString);
conn.Open();
_connectionString = connectionString;
var sb = new SqlConnectionStringBuilder(_connectionString);
_server = sb.DataSource;
_database = sb.InitialCatalog;
return conn;
}
The connection string that is being passed in is output from a SqlConnectionStringBuilder elsewhere in the application. The connection string is similar to: "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"
What did the trick for me is increasing the timeout on the connection string, since when connecting by vpn it took to long to establish the connection. You can do this by adding ;connection timeout = value
I got the same error when connecting an application tried to connect to sql server while I was on a vpn.
By default the timeout is set to 15 seconds.
Seems you already have 60secs, maybe you just need more...
Hope it helps!
Try explicitly adding Application Name=MyAppName; to the connection string. Auto-generated value from the assembly name might exceed some limit.
Check network settings for things like explicitly limited frame size. Reboot router if SQL Server is running on another machine.
Try adding Pooling=False; to the connection string and checking whether this solves the problem with repeated connections on application restart.
This problem can be related to a firewall in the middle that is doing SSL inspection.
I Suggest you either try again using another connection not doing SSL inspection, or ask your firewall admin to create an exemption for the source and/or destination you are connecting to,
Cheers!
So this issue continued to plague me and it appears that it was a function of lag from my home network (I am a remote developer) and the work network accessed over a VPN. I have a 100ms average ping time to servers on the work network.
The real oddity is that the connection string worked without problem for months, then suddenly stopped. At the time, the Application Name value was something like Application Name = "MyProgram.DAL. Culture=en, PublicKeyToken=1a1a1a1a1a1a1a1a, Version=1.0.0.0". In other words a fully qualified assembly name. Eventually I changed this to the shortened "MyProgram.DAL" type name and it worked again.
Some months later, again I was beset by it. And I happened to find that if I just ate the exception and waited a few ticks, everything was fine. The application would happily use the connection even though it reported that it failed. Thus, I changed the method to the below:
public SqlConnection OpenSqlConnection(string connectionString)
{
var conn = new SqlConnection(connectionString);
var retries = 10;
while (conn.State != ConnectionState.Open && retries > 0)
{
try
{
conn.Open();
}
catch (Exception)
{
}
Thread.Sleep(500);
retries--;
}
_connectionString = connectionString;
var sb = new SqlConnectionStringBuilder(_connectionString);
_server = sb.DataSource;
_database = sb.InitialCatalog;
return conn;
}

.NET Oracle managed data access connection pooling not working or slow

I recently noticed that when our application does an SQL query to the Oracle database, it always takes at least 200 ms to execute. It doesn't matter how simple or complex the query is, the minimum time is about 200 ms. We're using the Oracle Managed Data Access driver for Oracle 11g.
I then created a simple console application to test the connection. I noticed that if I create the connection like in the example below, then every cmd.ExecuteReader method takes the extra 200 ms (opening the connection)?
using (OracleConnection con = new OracleConnection(connStr))
{
con.Open();
OracleCommand cmd = con.CreateCommand();
...
}
The connection state is always Closed when creating the connection like this (shouldn't it be open if the connections are pooled?).
If I open the connection at the start of the program and then pass the opened connection to the method, the cmd.ExecuteReader takes about 0-5 ms to return. I've tried to add Pooling=true to the connection string but it doesn't seem to do anything (it should be the default anyway).
Does this mean that the connection pooling is not working as it should? Or could there be any other reason why the cmd.ExecuteReader takes the extra 200 ms to execute?
The problem is almost the same as in this issue, except that we're using Oracle Connection pooling is slower than keeping one connection open
Is your database remote and the delay caused by network? In this case connection pooling works but the problem is that there is always a TCP communication roundtrip (and not even TNS packet). Unfortunately this happens with every Open call.
Managed data access implementation communicates in different way so the overhead takes place only at the very first Open call, then the Open method is free.
After a lot of testing and research I finally figured out where the extra 200ms comes from: my virtual computer's network adapter. I'm using VMWare Player and the connection was configured to "NAT" mode. When I changed the connection to "Bridged" mode the latency was removed.

Connect desktop c# application to online mySql databse

I have a windows form application in C# and sometimes I want to push some data table from this application to an online mySql server which is hosting all data for my website in PHP. To do that I've installed :
1- MySql for visual studio version 1.2.3
2- MySql Connector.Net 6.9
Also, I have enabled Remote MySql on the server so I can make the connection. I used the '%' wildcard for the meantime because my IP address is dynamic.
my basic c# connection code is as below :
MySql.Data.MySqlClient.MySqlConnection conn;
string myConnectionString;
myConnectionString = "Server=*******;Database=*******;Uid=******;Pwd=********;";
try
{
conn = new MySql.Data.MySqlClient.MySqlConnection();
conn.ConnectionString = myConnectionString;
conn.Open();
MessageBox.Show("connected successfully..");
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
MessageBox.Show(ex.Message);
}
Unfortunately, every time I run this code I am getting an error which says
"Unable to connect to any of the specified MySQL hosts".
I don't' know where the problem is. Is it something on the UNIX server which
blocks the connections or some other thing which I need to do. I am also new to the CPanel interface and how to deal with it.
I appreciate all the help provided.
Many Thanks.
http://www.codeproject.com/Articles/43438/Connect-C-to-MySQL
Did you see that? You can try it.
I know this is an old question but I had the same issue many years ago and the only way I could get it to work was to enable remote MySql on the server I was running. This basically means allowing remote connections to access the DB. This of course is very risky and poses a major security problem. You can limit connections from specific IPs, but in my opinion its best to have a local DB and then perhaps push updates to an online source somehow.

How to connect to SQL Server redundantly using C#?

I have two SQL Server machines, server1 and server2 that are redundant and have the same data.
My application wants to select data from a table in the msdb database every 1 second. But my application can connect only using one conection string. How to edit my application can work redudantly with both servers?
SQL Server 2000 SP4
Window Server 2003
C#
My connection string is
server=10.15.13.70;database=msdb;user id=sa;pwd=""
Please advise me.
Pick a server at random and insert the name or IP for that in the connection string before opening the connection.
using (SqlConnection _con = new SqlConnection("server=" + giveMeAServer() + ";database=msdb;user id=sa;pwd="))
and:
private String giveMeAServer()
{
return "10.15.13.70";
}
The proper fix, especially if you are reconnecting as often as once per second, is most likely to set up some sort of cluster on the SQL Server side, and connect to that, rather than having your application worry about load balancing the database backend.
Better is you try to open the connection for some interval say 5ms, and if connection cant be opened, switch to other server through connection string
What you are looking for is Load balancing. This is a technique that can only be applied to readonly databases. It basically spreads the load across multiple servers.
Here is a good read on load balancing with SQL Server 2000 by Microsoft.
http://technet.microsoft.com/en-us/library/cc917707.aspx
Imho, what you try to achieve should not be handled programmatically but on a hardware level.
Data Source=myServerAddress;Failover Partner=myMirrorServerAddress;Initial Catalog=myDataBase;Integrated Security=True;
(from http://www.mssqltips.com/tip.asp?tip=1289)

Categories