Android Tutorial Remote Database Connector (RDC) - Connect to any remote DB

Status
Not open for further replies.
jRDC version 2 is available here: https://www.b4x.com/android/forum/t...ation-of-rdc-remote-database-connector.61801/

This tutorial covers a new framework named Remote Database Connector (RDC). The purpose of RDC is to make it simple to develop Android applications that interact with remote database servers.

There are two components in this framework: a lightweight Java web server (the middleware) and a B4A class named DBRequestManager that interacts with this web server.

The Java web server can connect to any database platform that provides a JDBC driver.

This includes: MySQL, SQL Server, Oracle, Sybase, DB2, postgreSQL, Firebird and many others.

You can also use the web server without a database server by connecting to a local SQLite database file.

The Java web-server is a simple server that connects to the database server and to the Android clients.
As this is a Java app you can run it on Linux or Windows computers. It requires Java JRE 6 or 7.

This solution is much more powerful than the PHP (MySQL) and ASP.Net (MS SQL) solutions that are already available.

Main advantages over previous solutions:
  • Support for many types of database platforms.
  • Significantly better performance.
  • SQL statements are configured in the server (safer).
  • Support for all types of statements, including batch statements.
  • Support for BLOBs.

Server Configuration

JDBC is a Java API that provides a standard method to access any database. A database driver (jar file) is required for each type of database. You will need to download the driver for your database and put it in the jdbc_driver folder.

The Java server configuration is saved in a file named config.properties.
This file includes two sections: general configuration and a list of SQL commands.

For example:

SS-2013-08-04_16.10.20.png


Note that the configuration fields are case sensitive.

DriverClass / JdbcUrl - The values of these two fields are specific to each database platform. You will usually find the specification together with the required driver jar file.

User / Password - Database user and password.

ServerPort - The Java server will listen to this provided port.

Debug - If Debug is set to true then the SQL commands list will be loaded on every request. This is useful during development as it allows you to modify the commands without restarting the server process.

SQL Commands - A list of commands. Each command starts with 'sql.'. The commands can include question marks (parameterised queries). Question marks will be replaced with the values provided by the Android clients. Note that the command name is case sensitive and it doesn't include the 'sql.' prefix.

Client Code
The client sends requests to the server. There are two types of requests: query requests (usually SELECT statements) and batch requests (any other statement).

Note that both the client and the server can manage multiple requests in parallel.
Usually you will only need a single DBRequestManager object.

Each request is made of a command (or a list of commands) and a tag. The tag can be any object you like. You can use it later when the result is ready. The tag is not sent to the server.

A command is an object of type DBCommand:
B4X:
Type DBCommand (Name As String, Parameters() As Object)
Name - The case sensitive command name as configured in the server configuration (without sql.).
Parameters - An array of objects that will be sent to the server and will replace the question marks in the command.

For example to send a SELECT request:
B4X:
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "select_animal"
cmd.Parameters = Array As Object("cat 1")
reqManager.ExecuteQuery(cmd, 0, "cat 1")
ExecuteQuery expects three parameters: the command, maximum number of rows to return or 0 if there is no limit and the tag value.

Under the hood DBRequestManager creates a HttpJob for each request. The job name is always "DBRequest".

You should handle the JobDone event in your activity or service:
B4X:
Sub JobDone(Job As HttpJob)
   If Job.Success = False Then
     Log("Error: " & Job.ErrorMessage)
   Else
     If Job.JobName = "DBRequest" Then
       Dim result As DBResult = reqManager.HandleJob(Job)
       If result.Tag = "cat 1" Then 'query tag
         For Each records() As Object In result.Rows
           Dim name As String = records(0) 'or records(result.Columns.Get("name"))
           Log(name)
         Next
       End If
     End If
   End If
   Job.Release
End Sub

As you can see in the above code, DBRequestManager.HandleJob method takes the Job and returns a DBResult object:
B4X:
Type DBResult (Tag As Object, Columns As Map, Rows As List)
Tag - The request tag.
Columns - A Map with the columns names as keys and the columns ordinals as values.
Rows - A list that holds an array of objects for each row in the result set.

Non-select commands are sent with ExecuteCommand (single command) or ExecuteBatch (any number of commands). It is significantly faster to send one request with multiple commands over multiple requests. Batch statements are executed in a single transaction. If one of the commands fail all the batch commands will be cancelled (roll-backed).

Note that for non-select requests, Rows field in the results will hold an array with a single int for each command. The int value is the number of affected rows (for each command separately).

Initializing DBRequestManager:
B4X:
Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
     reqManager.Initialize(Me, "http://192.168.0.100:17178")
   End If
End Sub
The first parameter is the module that will handle the JobDone event.
The second parameter is the link to the Java server (with the port number).

DBRequestManager provides the following helper methods for common tasks related to BLOB fields: FileToBytes, ImageToBytes and BytesToImage.It also includes a method named PrintTable that prints DBTable objects to the logs.

Framework Setup
  1. Unpack the server zip file.
  2. You will need to download the driver for your database platform and copy the jar file to jdbc_driver folder.
  3. Edit config.properties as discussed above.
  4. Edit RunRLC.bat and set the path to java.exe. If you are running it on Linux then you need to create a similar script with the path to java. On Linux you should change the ';' separator to ':'.
  5. Run the server :)
    You should see something like:

    SS-2013-08-04_17.05.16.png


    Note that the path to config.properties is printed in the second line.
  6. Add an exception for the server port in your firewall.
  7. Try to access the server from the browser:

    SS-2013-08-04_17.06.17.png


    You will probably not see the above message on the first run :(. Instead you will need to check the server output and read the error message.
    If you are able to call the server from the local computer and not from other devices then it is a firewall issue.

Tips

  • MySQL driver is available here: http://dev.mysql.com/downloads/connector/j/
  • Google for <your database> JDBC Driver to find the required driver. For SQL Server you can use this open source project: http://jtds.sourceforge.net/
  • The server uses an open source project named c3p0 to manage the database connection pool. It can be configured if needed by modifying the c3p0.properties file.
  • Use a text editor such as Notepad++ to edit the properties file.
  • If you are running the server on Linux then you can run it with nohup to prevent the OS from killing the process when you log out.
  • Java doesn't need to be installed. You can just unpack the files.
The server is based on the two following open source projects:
Jetty - http://www.eclipse.org/jetty/
c3p0 - http://www.mchange.com/projects/c3p0/index.html
http://www.mchange.com/projects/c3p0/index.html
 
Last edited:

stingrae

Member
Licensed User
Longtime User
Hi, when you say
Server Configuration

JDBC is a Java API that provides a standard method to access any database. A database driver (jar file) is required for each type of database. You will need to download the driver for your database and put it in the jdbc_driver folder.

The Java server configuration is saved in a file named config.properties.
This file includes two sections: general configuration and a list of SQL commands.
does that mean I have to put a file on the server of where the SQL Database lives? I don't actually host my own webserver so I don't know if I am able to just do this or not.
Can you please clarify?
Thanks.
 

Douglas Farias

Expert
Licensed User
Longtime User
RemoteServer is running (Wed Jun 25 09:45:01 BRT 2014)
Connection successful.

ok
now how can i conect in the db with navicat
what i use
ip
id
pass

from
config.properties ?
i want to see all tables i have etc etc how can i?
 

Douglas Farias

Expert
Licensed User
Longtime User
This, is a visual part of your db
i need only to know how to conect on 1.jpg

for exemple
when i install de xamp

i can conect with localhost id=root pass=
and navicat conect on this

navicat u can conect to any db and see edit tables make changes
remote or local

same of phpmyadmin
 

Attachments

  • 1.jpg
    1.jpg
    240.9 KB · Views: 376
  • 2.jpg
    2.jpg
    247.2 KB · Views: 400
  • 3.jpg
    3.jpg
    255.5 KB · Views: 403
  • 4.jpg
    4.jpg
    244.5 KB · Views: 401

MrKim

Well-Known Member
Licensed User
Longtime User
Sigh, after four hours of monkey and typewriter work I finally got the sourceforge Java SQL Driver to work. I noticed a lot of posts struggling with this so I thought I would share a little of what I learned
This is what worked for me.
B4X:
DriverClass=net.sourceforge.jtds.jdbc.Driver
JdbcUrl=jdbc:jtds:sqlserver://127.5.5.1:49959/AndroidTest
User=skdata
Password=shopkeeper
A real key: Open the SQL server error log and look at what is failing. If you do not see a failed login then you aren't even getting to the server.
127.0.0.1 DID NOT WORK. I don't know why other than that it gave me this error in the SQL server log:
B4X:
Logon,Unknown,Login failed for user 'skdata'. Reason: Login-based server access validation failed with an infrastructure error. Check for previous errors. [CLIENT: 127.0.0.1]
I also received this error:
.
B4X:
Logon,Unknown,Could not connect because the maximum number of '1' dedicated administrator connections already exists. Before a new connection can be made<c/> the existing dedicated administrator connection must be dropped<c/> either by logging off or ending the process. [CLIENT: 127.0.0.1]
I believe the difference was the PORT I was using. evidently one of the ports listed is a dedicated administrator port. Who knows, it might have succeeded if I logged out of SSMS.
I also ran this script - don't know if it was required or not.
B4X:
USE master
Go
GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] to [skdata]
go
GRANT CONNECT SQL TO "skdata"
Since my server is set to listen on any IP I chose the one above at random and it worked with the selected PORT.
How did I pick the port?
Again, look at the log and search for 'listening on'. This will show you what ports your server is actually listening on. Try those ports.
You MUST SELECT 'SQL Server and Windows Authentication Mode'. SSMS>Right-Click the DB>Properties>security page.
You can look at how it is all setup HERE: (Start>All Programs>Microsoft SQL Server XXXX>Configuration Tools>SQL Server Configuration Manager
upload_2014-7-21_18-51-14.png



My system is set up with listen all:
upload_2014-7-21_18-54-43.png

If your is not go to the IP Addresses Tab and see what is listening. Evidently the IP Addresses Tab is irrelevant if 'Listen All' is yes.
Any changes here require a server restart. Again the best place to see your addresses and Ports is look at the server log. It will tell you what it is listening on.

I would really liked to have gone with the server name but couldn't get it to work.

Addendum:
All of the above got things working LOCALLY. The minute I tried to access from the tablet it failed. This was a firewall issue NOT on the WINDOWS computer but with the WIRELESS ROUTER. I had to go in to the router and port forward my port, so the IP on the TABLET actually wound up being the IP of the COMPUTER that the server was installed on. There you can use (I think) whatever port you want as long as it is forwarded to the port you have selected for your RDC.

Addendum2:
Where I say above that the IP address doesn't matter IS TRUE ONLY IF THE RDC IS SET UP ON THE SAME COMPUTER AS THE SQL SERVER! If you are setting up the RDC on another computer then the IP address must be the IP of the SQL SERVER computer. So:
B4X:
JdbcUrl=jdbc:jtds:sqlserver://127.5.5.1:49959/AndroidTest
Becomes:
B4X:
JdbcUrl=jdbc:jtds:sqlserver:SERVER.IP.ADDRESS:49959/AndroidTest

NOTE that all of this I am testing on Windows 7/8 computers. The rules may be different for an actual windows server.

Hope this helps someone.

Kim
 
Last edited:

buras3

Active Member
Licensed User
Longtime User
hello

can anyone help me ?


C:\Users\Michael\Downloads\RemoteDatabaseConnector>"C:\Program Files (x86)\Java\
jre7\bin\java" -Xmx256m -cp .;libs\*;jdbc_driver\* anywheresoftware.b4a.remoteda
tabase.RemoteServer
B4A Remote Database Connecter (version 0.9)
loading: C:\Users\Michael\Downloads\RemoteDatabaseConnector\config.properties
2014-07-27 12:48:40.785:INFO::jetty-7.4.2.v20110526
2014-07-27 12:48:40.815:INFO::started o.e.j.s.ServletContextHandler{/,null}
Θσ∞ 27, 2014 12:48:40 PM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Θσ∞ 27, 2014 12:48:40 PM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 11:16:28 +0000; debug? true
; trace: 10]
2014-07-27 12:48:41.055:INFO::Started SelectChannelConnector@0.0.0.0:1433 STARTI
NG
Θσ∞ 27, 2014 12:48:44 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource g
etPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acqu
ireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCo
mmitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> fa
lse, checkoutTimeout -> 20000, connectionCustomizerClassName -> null, connection
TesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceN
ame -> 2rvxtt93x2vju31hakpiz|be8216, debugUnreturnedConnectionStackTraces -> fal
se, description -> null, driverClass -> net.sourceforge.jtds.jdbc.Driver, factor
yClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToke
n -> 2rvxtt93x2vju31hakpiz|be8216, idleConnectionTestPeriod -> 600, initialPoolS
ize -> 3, jdbcUrl -> jdbc:jtds:sqlserver://127.0.0.1:1433/SQLMICHAEL est, max
AdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 1800, maxIdle
TimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 150, maxStatemen
tsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuer
y -> null, properties -> {user=******, password=******}, propertyCycle -> 0, sta
tementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testC
onnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides ->
{}, usesTraditionalReflectiveProxies -> false ]
Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool$Scattered
AcquireTask run
WARNING: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@2a46
d1 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to a
cquire a needed new resource, we failed to succeed more than the maximum number
of allowed acquisition attempts (30). Last acquisition attempt exception:
java.sql.SQLException: I/O Error: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:632)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:3
71)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManag
erDataSource.java:146)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:195)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:184)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionRe
sourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResource
Pool.java:1086)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPe
ndingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourc
ePool.java:44)
at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.ru
n(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(Thre
adPoolAsynchronousRunner.java:648)
Caused by: java.io.IOException: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:8
61)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java
:731)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.jav
a:477)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114
)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2368)
... 12 more

Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool forceKill
Acquires
WARNING: Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicR
esourcePool@111057b is interrupting all Threads waiting on a resource to check o
ut. Will try again in response to new client requests.
java.sql.SQLException: An attempt by a client to checkout a Connection has timed
out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConne
ction(C3P0PooledConnectionPool.java:687)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(A
bstractPoolBackedDataSource.java:140)
at anywheresoftware.b4a.remotedatabase.Servlet.doGet(Servlet.java:64)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:538
)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:478)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:937)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
406)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:871)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:117)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.
java:589)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete
(HttpConnection.java:1048)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:601)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)

at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:41
1)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEn
dPoint.java:535)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEnd
Point.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:529)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out whil
e waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePo
ol@111057b -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicRes
ourcePool.java:1416)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(
BasicResourcePool.java:606)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicR
esourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConn
ectionInUse(C3P0PooledConnectionPool.java:755)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConne
ction(C3P0PooledConnectionPool.java:682)
... 21 more
Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool$Scattered
AcquireTask run
WARNING: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1dba
d5b -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to
acquire a needed new resource, we failed to succeed more than the maximum number
of allowed acquisition attempts (30). Last acquisition attempt exception:
java.sql.SQLException: I/O Error: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:632)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:3
71)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManag
erDataSource.java:146)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:195)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:184)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionRe
sourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResource
Pool.java:1086)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPe
ndingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourc
ePool.java:44)
at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.ru
n(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(Thre
adPoolAsynchronousRunner.java:648)
Caused by: java.io.IOException: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:8
61)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java
:731)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.jav
a:477)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114
)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2368)
... 12 more

Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool$Scattered
AcquireTask run
WARNING: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1742
9c2 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to
acquire a needed new resource, we failed to succeed more than the maximum number
of allowed acquisition attempts (30). Last acquisition attempt exception:
java.sql.SQLException: I/O Error: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:632)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:3
71)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManag
erDataSource.java:146)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:195)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnecti
on(WrapperConnectionPoolDataSource.java:184)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionRe
sourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResource
Pool.java:1086)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPe
ndingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourc
ePool.java:44)
at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.ru
n(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(Thre
adPoolAsynchronousRunner.java:648)
Caused by: java.io.IOException: Unknown packet type 0x48
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:8
61)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java
:731)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.jav
a:477)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114
)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2368)
... 12 more

Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool forceKill
Acquires
WARNING: Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicR
esourcePool@111057b is interrupting all Threads waiting on a resource to check o
ut. Will try again in response to new client requests.
Θσ∞ 27, 2014 12:49:17 PM com.mchange.v2.resourcepool.BasicResourcePool forceKill
Acquires
WARNING: Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicR
esourcePool@111057b is interrupting all Threads waiting on a resource to check o
ut. Will try again in response to new client requests.
 
Last edited:

buras3

Active Member
Licensed User
Longtime User
Sql server 2008 R2

Is this the file i need to put in folder jdbc_driver : jtds-1.3.1.jar?
 

buras3

Active Member
Licensed User
Longtime User
I have tried with with\without port ,instance name , computer name \IP
in vb6 and vb.net it's working
Dim ConString As String = "Data Source=127.0.0.1\SQLMICHAEL;Initial Catalog=test;User ID=sa;Password=333"

**Edit RunRLc**
"C:\Program Files (x86)\Java\jre7\bin\java" -Xmx256m -cp .;libs\*;jdbc_driver\* anywheresoftware.b4a.remotedatabase.RemoteServer
pause

**config file**
#Lines starting with '#' are comments.
#Backslash character at the end of line means that the command continues in the next line.
#DriverClass=net.sourceforge.jtds.jdbc.Driver
#JdbcUrl=jdbc:jtds:sqlserver://127.0.0.1\test

#SQL Server
DriverClass=net.sourceforge.jtds.jdbc.Driver
JdbcUrl=jdbc:jtds:sqlserver://127.0.0.1\test

User=sa
Password=333
ServerPort=1433
#If Debug is true then this file will be reloaded on every query.
#This is useful if you need to modify the queries.
Debug=true

#commands
sql.create_table=CREATE TABLE animals (\
id INT NOT NULL AUTO_INCREMENT,\
name CHAR(30) NOT NULL,\
image BLOB,\
PRIMARY KEY (id))
sql.insert_animal=INSERT INTO animals VALUES (null, ?,?)
sql.select_animal=SELECT name, image FROM animals WHERE name = ?
 

buras3

Active Member
Licensed User
Longtime User
same problem

#SQL Server
DriverClass=net.sourceforge.jtds.jdbc.Driver
JdbcUrl=jdbc:jtds:sqlserver://127.0.0.1/test

User=sa
Password=333
ServerPort=17178
 

buras3

Active Member
Licensed User
Longtime User
I got it!! by changing all ports to 1433 in sql configuration manager
tank you
 
Last edited:

MrKim

Well-Known Member
Licensed User
Longtime User
Is it possible to set a null value? I have field that sometimes needs to be set back to Null. Putting the Keyword Null in my parameters puts the word null in the data.
 
Status
Not open for further replies.
Top