Connect java to sql server via JDBC [duplicate] - java

This question already has answers here:
The TCP/IP connection to the host localhost, port 1433 has failed error, need assistance
(4 answers)
Closed last month.
I try, without any success, to connect my java project to my sql server database (local on my laptop).
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JvaConnect2SQL {
public static void main(String[] args) {
String url = "jdbc:sqlserver://LAPTOP-0CSKUFIE\\MSSQLSERVER;databaseName=datatreck";
String username = "sa";
String password = "hello";
try {
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("Connecté à SQL server");
} catch (SQLException e) {
System.out.println("Erreur - Problème lors de la connexion");
e.printStackTrace();
}
}
}
The error is :
com.microsoft.sqlserver.jdbc.SQLServerException: La connexion à l'hôte LAPTOP-0CSKUFIE, instance nommée mssqlserver, a échoué. Erreur : « java.net.SocketTimeoutException: Receive timed out ». Vérifiez le nom du serveur et celui de l'instance et veillez à ce qu'aucun pare-feu ne bloque le trafic UDP vers le port 1434. Pour SQL Server 2005 ou ultérieur, vérifiez que le service SQL Server Browser est en cours d'exécution sur l'hôte.
English Translation:
com.microsoft.sqlserver.jdbc.SQLServerException: Connection to host LAPTOP-0CSKUFIE, instance named mssqlserver, failed. Error: "java.net.SocketTimeoutException: Receive timed out". Check the server name and instance name and ensure that no firewall is blocking UDP traffic to port 1434. For SQL Server 2005 or later, verify that the SQL Server Browser service is running. running on the host.
It seems the name of the host and/or instance are not right ><
but I was sure it was the good ones, so I'm confuse ...
How can I be sure of my host/instance names ?
Is the code all right ?
I add exception to the fire wall and add the jdbc driver.
I don't understand why the connexion fail.

Just a simple tip: don't code or install applications in your native language. There are many reasons for doing that, but I am not going to list them here.
If SQL server is running on your local computer/server requests should be made to localhost:port (for example localhost:1433)
Check an example connection string and steps to connect to the database here: https://stackoverflow.com/a/71481219/19879452

Related

MS SQL Connection: Android Studio never connects vs Eclipse IDE does

I am creating a program for a local organization to take inventory. App connects to SQL Server via MSSQL 8.2 connector. App on phone should allow for receiving and sending item information. I have a static class to connect to the database, that handles the connection. In Eclipse, I am able to successfully connect and query the database. In Android studio, I get errors on every attempt to connect.
-Server is hosted on same pc.
-Ports have been configured, repeatedly. Currently have inbound and outbound rules for TCP and UDP fully open. Dynamic ports are on for SQL server. Services for SQL server have been restarted dozens of times. 1433 has been enabled and toggled off, but are currently blank.
-Attempted to connect by IP address, host cannot be resolved
-Permissions edited to allow login access to modify the database
-Integrated security and TLS security tried at different times, both failed.
List of errors:
Connection to the host BLACK-G, "xxxxx" port 1433, has failed.
TCP/IP connection to the host failed, unable to resolve host.
Connection to the host named BLACK-G instance sqlexpress failed,No
address associated with hostname, open up UDP traffic to port 1434
Unknown host exception. Unable to resolve host BLACK-G
Connection Refused
Failed to connect
Connection to the host 192.168.1.219 has failed. Failed to connect to
192.168.1.219 (port 1433) from 192.168.1.87(port 33654) after 2478ms Verify connection properties.
Here is the code
package com.example.ccupboard_1;
import android.os.Build;
import androidx.annotation.RequiresApi;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseJAVA {
// #RequiresApi(api = Build.VERSION_CODES.KITKAT)//public static void main(String[] args) {
public static String Connect() {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://BLACK-G\\SQLEXPRESS;user=ay7;password=343434;databaseName=ayTestDatabase2;" ;
ResultSet resultSet = null;
try (Connection connection = DriverManager.getConnection(connectionUrl);
Statement statement = connection.createStatement();) {
// Create and execute a SELECT SQL statement.
String selectSql = "SELECT Fname, Lname from dbo.Customers";
resultSet = statement.executeQuery(selectSql);
// Print results from select statement
while (resultSet.next()) {
result += (resultSet.getString("Fname") + " " + resultSet.getString("Lname")+"\n");
}
} catch (SQLException e) {
e.printStackTrace();
result = e + "";
}
return result;
}
}
Snippet from main activity that calls connect method:
case R.id.buttonSignOut: { //used to test connection currently, simply attempts to connect and //returns the value to a textview on the page
Thread thread = new Thread() {
public void run() {
textviewLowItemAlert.setText(DatabaseJAVA.Connect());
}
};
thread.start();
break;
What would be the next step in resolving this issue? It works in Eclipse, but not in studio. I've tried more than a dozen different connection Strings, and most of them threw the same errors. Does my server not allow access to Android Studio? Most of the errors seem to be Android studio being incapable of locating it on the server.
Here's a snippet from a working app of mine where I can connect succesfully to a local ms sql.
In a config file I set the connection info.
public static String dbUser = "user";
public static String dbPassword = "password";
public final static String sqlString = "jdbc:jtds:sqlserver://ip:port//INSTANCENAME";
Then I start the connection like this.
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
DriverManager.setLoginTimeout(5);
connection = DriverManager.getConnection(Config.sqlString, Config.dbUser, Config.dbPassword); // Connect to database
if (connection == null) {
ConnectionResult = "Verify Internet Connection";
Toast.makeText(activity, ConnectionResult, Toast.LENGTH_LONG).show();
Finally just do the query and close the connection.
Alright, was finally able to figure it out, with the JDBC-JTDS connector mentioned by JoaquinAlvarez.
Here's what happened:
-Used the connection info he provided, with my IP address, and a higher timeout
-Network Error IOException, EHOSTUNREACH(No route to host),
-Router changed my IP address, so had to fix that
-After that, I used my PCNAME\SQLEXPRESS for the the for the instance
-It returned Instance Unreachable, so I changed to SQLEXPRESS alone
-Then it returned DB Closed connection
-I looked at Windows Event Viewer, and it said:
"Encryption is required to connect to this server but the client library does not support encryption; the connection has been closed. Please upgrade your client library."
-I checked the SQL server in SQL SERVER Configuration Manager... Force Encryption was turned on.
-Tried again, and the JTDS connector finally connected to the Database and I was able to do things. No help with the MSSQL one yet though.
Thank you Mr. Alvarez!

How to connect to database which is hosted in remote machine using java program [duplicate]

This question already has answers here:
IO Error: The Network Adapter could not establish the connection
(12 answers)
Closed 3 years ago.
I'm trying to connect to a database which is hosted in a remote machine. I have a java project in my local and it has to connect to DB which is in remote machine for an update. What is the java code which I can use to connect. Traditional code of connection doesn't work and it shows below error.
import java.beans.Statement;
import java.sql.*;
public class connectTest {
public static void main(String[] args) {
try{
//step1 load the driver class
Class.forName("oracle.jdbc.driver.OracleDriver");
// Class.forName("oracle.jdbc.OracleDriver");
Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:#172.25.250.183:1521/aaadv4","boomerang","Telus2014");
Wrapper stmt=con.createStatement();
ResultSet rs=((java.sql.Statement) stmt).executeQuery("select * from ttv_dhcp_log.ACCT_MSG where SUB_IF='BACUPQXQOT01 PON 1/1/12/02:21.1.1'");
while(rs.next())
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
//step5 close the connection object
con.close();
}catch(Exception e){ System.out.println(e);}
}
}
I expect it to connect to DB but it fails with below message.
java.sql.SQLException: Io exception: The Network Adapter could not
establish the connection
There could be a couple of things you need to verify.
Check if the port is accessible from the machine . Use comamnds like telnet to check that.
Ex: telnet IPaddress portnumber
Check your firewall in your machine to see if connections to the port range are allowed or not.
Check the firewall rules in the machine where Oracle db is hoster as well.
Ensure your Credentials are correct.
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = null;
connection = DriverManager.getConnection("jdbc:oracle:thin:#172.25.250.183:1521:aaadv4","username","password");
connection.close();
Use the above. Your DB connection URL contains a "/" instead of ":" . Also, ensure your IP address is accessible from your machine. If you are in the same network. It should be. If not, follow the debugging steps given above.

Connection refused: connect, can't connect database mysql

I can't connect remote database. When I connect my own database on localhost, it connects. What's wrong?
Exception in thread "main" java.lang.IllegalStateException: Cannot connect the database!
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.net.ConnectException: Connection refused: connect
Java Code:
String url = "jdbc:mysql://ipadress:3306/database?autoReconnect=true&useSSL=false";
String username = "username";
String password = "password";
String query = "SELECT * FROM database";
System.out.println("Connecting database...");
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Database connected!");
//Uruchamiamy zapytanie do bazy danych
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
}
connection.close();
} catch (SQLException e) {
throw new IllegalStateException("Cannot connect the database!", e);
}
}
I can login to database on PHPMyAdmin, I have no root account, it's my friend's database. I checked if port 3306 is open here: http://www.yougetsignal.com/tools/open-ports/ and it's closed. Where can I open it? In router settings in "port forwarding"? What private IP and type(TCP or UDP) should I set to open this port?
(Apologies if this answer is incomplete, but there is too much that does not fit in comments)
1) Don't ignore exceptions. This is bad : with // handle the error and nothing else in your catch block, in case of error there, your code will not report the error, and will move on with the execution (it should exit/break/return, depending on where that piece of code is).
2) I think checking "SHOW GLOBAL VARIABLES LIKE 'PORT';" is not enough. Ask your friend if the database daemon actually listens to port 3306 on a network interface that you can reach. MySQL can be configured with networking disabled (skip-networking), or enabled but only for local machine (bind-address=127.0.0.1 or localhost -- it should be bind-address=0.0.0.0 or bind-address=hostname or public IP address...).
To check for that yourself, if you are on linux, try with nc or telnet (install nc if you don't have it): nc remotehost 3306. If you get "connection refused", the error is definitely not in your java code, but in the server setup.

loadPolicyFile doesnt work in AS3

(Im bad in english i try to be good for a good explain)
i got a client socket in AS3 and a server in Java. In localhost, i got no problem to connect my client and my server. They can exchange data with no problem with this line :
socket.connect("127.0.0.1", 2030);
Its ok, my server can receive a Byte[] data , can read and write to my client with no problem.
But now i want to past the server "online" so i open the port 2030 for the connection and the 82 port, and i try to read the crossdomain.xml to be autorized, with :
Security.loadPolicyFile("http://90.20.233.143:82/crossdomain.xml");
socket.connect("http://90.20.233.143", 2030);
now when im start the connection ... have got some problem with Security.loadPolicyFile
Im getting on JAVA Server :
java.net.SocketException: Connection reset
And in Client As3 (in french):
Connexion au serveur.... Vous etes connecté au serveur
Avertissement :La balise non valide est ignorée
pour le domaine 'http://90.20.233.143' dans le fichier de régulation
présent à http://90.20.233.143:82/crossdomain.xml
Socket error: [IOErrorEvent type="ioError" bubbles=false
cancelable=false eventPhase=2 text="Error #2031: Erreur de socket.
URL: 90.19.160.185"] // its sur cause "connection reset" on JAVA
my code in my crossdomain.xml :
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="http://90.20.233.143/" to-ports="*"/>
<site-control permitted-cross-domain-policies="all" />
</cross-domain-policy>
i dont know where is the problem ...
It's a http server , http://90.20.233.143:82/crossdomain.xml , is path of crossdomain.xml.
The client can read the XML but he said that "marker" isnt good, so he will ignore the marker ("balise" in french). SO the plan is open port 843 on my http server ? Or java server ?
Ok ok so i convert the code in a Byte in XML file , and by the method Security.loadPolicyFile , i read the XML ?

How to access the remote database using java

Iam trying to access database from system to other system, below is code.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class testConnection {
/**
* #param args
* #throws SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
String connectionURL = "jdbc:sqlserver://xxx.xxx.xx.xx:1433;DatabaseName=fingerprintdb;user=sa;password=test";
// Change the connection string according to your db, ip, username and password
Connection con = null;
try {
// Load the Driver class.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// If you are using any other database then load the right driver here.
//Create the connection using the static getConnection method
con = DriverManager.getConnection (connectionURL);
//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();
//Execute the SQL statement and get the results in a Resultset
ResultSet rs = stmt.executeQuery("select moviename, releasedate from movies");
// Iterate through the ResultSet, displaying two values
// for each row using the getString method
while (rs.next())
System.out.println("Name= " + rs.getString("moviename") + " Date= " + rs.getString("releasedate"));
}
catch (SQLException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
// Close the connection
con.close();
}
}
}
Below is exception iam getting.
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host xxx.xxx.xx.xx, port 1433 has failed. Error: "connect timed out. Verify the connection properties, check that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port, and that no firewall is blocking TCP connections to the port.".
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1049)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:833)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:716)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:841)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at testConnection.main(testConnection.java:26)
Exception in thread "main" java.lang.NullPointerException
at testConnection.main(testConnection.java:48)
Iam able to connect to the database from the same syste. but now iam trying to connect remote way.
I got the above ip address from typing ipconfig in cmd prompt.
Am I doing correctly, if not please correct me.
Below is log of pings to host.
Pinging xxx.xxx.xx.xx with 32 bytes of data:
Reply from xxx.xxx.xx.xx: TTL expired in transit.
Reply from xxx.xxx.xx.xx: TTL expired in transit.
Reply from xxx.xxx.xx.xx: TTL expired in transit.
Reply from xxx.xxx.xx.xx: TTL expired in transit.
Ping statistics for xxx.xxx.xx.xx:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
Yes, Sometimes it Happens.. (Do the following Process where your SQLServer is installed)
You need to Go to
Start > Microsoft SQL Server > Configuration Tools > SQL Server Configuration Manager
When it opens Go to
SQL Server Configuration Manager > SQL Server Network Configuration > Protocols for SQLExpress
Where you'll find the Protocol TCP/IP, if disabled then Enable it Click on TCP/IP, You'll find its properties.
In this properties Remove All the TCP Dynamic Ports and Add value of 1433 to all TCP Port
and restart your
SQL Server Services > SQL Server
And Its Done...
you need to configure the remote SQL server to accept TCP/IP connection and you may require to allow remote connection in case if it not enabled.

Categories