Is there a way to use SQL statements to query a CSV file on NetBeans without using a database connection? - sql

I am trying to create an executible JAR file that has my database self-contained as a CSV file (the point is that if I share the program to another computer, that computer does not need to download MySQL in order to access the information in the database).
I have imported H2 libraries, so that I can convert the CSV into a ResultSet. Is there a way I can integrate SQL statements to manipulate the ResultSet without having to set up a connection to a database?
This is what I have so far, with a connection to a database:
// This is where I want to retrieve the data (from the CSV),
// but the only way I know how to run SQL requires that the data is
// retrieved from the MySQL database connection.
ResultSet rs = new Csv().read("file.csv", null, null);
// This is the traditional way of executing an SQL query statement
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","password");
Statement stmt = con.createStatement(); // Another way to create the statement?
rs = stmt.executeQuery(sql);

Related

Import Data to Excel Using SQL/OLE DB

I'm trying to recreate an excel file that I had found that imported data into a table using an OLE DB Query Connection that made use of a SQL server. When I go to the connection properties of the connection I'm trying to recreate, there's no connection file and the connection type states that it is an OLE DB Query. It has a lengthy connection string with the information of the SQL server and then the SQL command text that tells the query basically what to search for.
I am using the 2010 v. of Excel so I go to Data > From Other Sources > Data Connection Wizard > Other/Advanced....
I have no idea where to go from there. I've tried clicking on the OLE DB for SQL but it doesn't seem like it's right as it'll delete itself because there's apparently too much data from the query and it'll take too long to load.

Convert SQL Insert command to Xamarin SQLite database

I have a lengthy SQL INSERT command that I would essentially like to convert to a local Xamarin database, using SQLite. Is there any easy way around this or do I manually have to create an object from each value which is then entered into the local SQLite database?
If you want to pre-seed your database and ship it with the app, then as Jason suggested, you can use SQLite Manager.
If you want the mobile app to seed the database on first load, you will need to create the objects (tables) first and run the below for each table you have.
SQLiteConnection conn = ....
conn.CreateTable<TableClass>();
Then if you just want to run the insert queries you have, you can use the Execute method.
public int Execute(string query, params object[] args)
However SQLite isn't as powerful as MS SQL and if your insert queries are complex, you will have to modify them and possibly your DB Schema, depending upon column types.

BULKINSERT from MatLab to SQL server

I'm running a MatLab script, where I update a table on a SQL connection. All is OK if I read or update table from SQL server trhough matLab simple command; data appears perfectly. But I'm facing troubles when I use BULINSERT command. No data are updated!! However, it works while SQL console of SQL Server Management Studio.
My code (MatLab sample):
conn = database('Dados_SQL','sa','SQL#Edison');
A = {100000.00,'KGreen','06/22/2011','Challengers'};
A = A(ones(10000,1),:);
fid = fopen('c:\temp\tmp.txt','wt');
for i = 1:size(A,1)
fprintf(fid,'%10.2f \t %s \t %s \t %s \n',A{i,1}, ...
A{i,2},A{i,3},A{i,4});
e = exec(conn,['bulk insert BULKTEST from '...
'''c:\temp\tmp.txt''with (fieldterminator = ''\t'', '...
'rowterminator = ''\n'')']);
end
close(e);
Thanks in advance.!
Edison.
MSSQL has problems reading from a drive which is not local to the database. If your C drive is not the database drive, that might be the problem. You have two options:
Generate a file that you save onto the database server from matlab. Perhaps you have a shared filesystem so this is easy. Or use FTP. Or even Dropbox on each server. This depends on your setup and security requirements.
Generate a large text set of all SQL insert commands you want to run, and send them to the server in a single query. This takes away the need for multiple connections to the server which is slow, but it is not as efficient on the server side as a bulk insert.

Copy data between two server instances

I want something like :
insert into server2.database1.table1 select * from server1.database1.table1
both tables are exactly the same.
how can I Copy data between two server instances?
SQL - Linked Server
If both servers are SQL Server, you can set up Linked servers - I would suggest using an SQL account for security there.
Then you can simply perform
insert into server2.database1.dbo.table1
select * from server1.database1.dbo.table1 where col1 = 'X'
If you run the query in SQL Management studio connected to server1, and current database set to database1, you won't need the prefix
server1.database1.dbo.
Also, the linked server would be configured on server1, to connect to server2 (rather than the other way around).
If you have the correct OLE DB drivers, this method can also work between different types of RDBMS (ie. non-SQL Server ones).
Open Query
Note: Beware not to rely on linked servers too much especially for filtering, and for joins across servers, as they require data to be read in full to the originating RDBMS before any conditions can be applied. Many complications can arise from Linked Servers, so read up before you embark, as even version differences might cause headaches.
I recommend you use the OPENQUERY command for SQL Servers to get around such limitations. Here's an example, but you should find help specific to your needs through further research:
insert into server2.database1.dbo.table1
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X''');
The above code is more efficient, filtering the data on the source server (and using available indexes), before pumping the data through, saving bandwidth/time/resources of both the source and destination servers.
(Also note the double quote '', is an escape sequence to produce a single quote.)
SQL - Temporarily on the same server
Would enable (note the underscore):
insert into server2_database1.dbo.table1
select * from database1.dbo.table1
Still within the SQL query domain. If you can temporarily move the database on server2 to server1, then you won't need the linked server. A rename of the database would appear to be required while co-locating on server1. Achieving such co-location could use various methods, I suggest shrinking database files before proceeding with either:
Backup/Restore - Backup on server2, Restore on server1 (with different name) - perform insert as described above, but without the server1 or server2 prefixes. Then reverse - backup on server1, restore on server2/
Detach/Attach - Rename database, Detach on server2, (compress), copy files to server 1, (decompress), attach on server1, perform insert. Then reverse...
In either case, SQL Server version could be a barrier. If server1 is of a lower SQL version, then both backup and detach/attach methods will likely fail. This can be worked around by moving the server1 database to server2, which may or may not be more suitible.
Other Methods
May be suitable, non-SQL/TSQL method failing favorable environmental factors for previously mentioned methods. And if you have the correct access (OLE DB Drivers, etc..), this method can also work between different types of RDBMS (ie. non-SQL Server ones), and data-sources (such as XML, flatfiles, Excel Spreadsheets...)
SSIS Explicitly with Business Development Management Studio - direct datapump or using delimited file intermeditary.
SSIS Implicitly through SQL Management Studio, by right clicking the database1 on server1 > Tasks > Export, then completing the wizard. May work direct to server2, or using a flat-file intermeditary.
.Net Programming with SqlBulkInsert (I believe the SSIS datapump uses such an object), I can go into more detail about this, if it interests you.
Eg. of SQLBulkInsert (psedo-C# code)
SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here");
SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here");
c.Open();
SqlCommand cm = new SqlCommand(c);
cm.CommandText = "select * from table1;";
using (SqlDataReader reader = cm.ExecuteReader())
{
using (SqlBulkInsert bc = new SqlBulkInsert(c))
{
c2.Open();
bc.DestinationTable = "table1";
bc.WriteToServer(reader);
}
}
Pretty cool huh? If speed/efficiency is a concern - SqlBulkInsert based approaches (Such as SSIS) are the best.
Update - Modifying the destination table
If you need to update the destination table, I recommend that you:
Write to a staging table on the destination database (a temporary table, or proper table which you truncate before and after process), the latter is preferable. The former may be your only choice if you don't have CREATE TABLE rights. You can perform the transfer using any one of the above options.
Run a MERGE INTO command as per your requirements from the staging table to the destination table. This can Insert, Update and Delete as required very efficiently.
Such a whole process could be enhanced with a sliding window (changes since last checked), only taking recently changed rows in the source an applying to the destination, this complicates the process, so you should at least accomplish the simpler one first. After completing a sliding window version, you could run the full-update one periodically to ensure there are no errors in the sliding window.
To copy data between two different servers you have several options:
Use linked servers.
Use the data import export wizard.
Use a third party tool such as Red Gate SQL Data Compare.
Similar to Todd C# SqlBulkCopy
Generally this is easier than creating linked servers.
Create a unit test and run the below, if you have triggers then be careful and you will need ALTER permissions.
[Test]
public void BulkCopy()
{
var fromConnectionString = #"fromConnectionString";
var destinationConnectionString = #"destConnectionString2";
using (var testConnection = new SqlConnection(fromConnectionString))
{
testConnection.Open();
var command = new SqlCommand("select * from MyTable;", testConnection);
using (var reader = command.ExecuteReader())
{
using (var destinationConnection = new SqlConnection(destinationConnectionString))
{
using (var bc = new SqlBulkCopy(destinationConnection))
{
destinationConnection.Open();
bc.DestinationTableName = "dbo.MyTable";
bc.WriteToServer(reader);
}
}
}
}
}
}
The best way to do this would be to create a "linked server".
And then you can use below statement into your insert statement in order to define your table
[linkedserver].databasename.dbo.tablename
On Server A add a linked server (B)
http://msdn.microsoft.com/en-us/library/ms188279.aspx
Then you can transfer data between the two.
Export table data from one SQL Server to another
HTH
First You need to add the server
Eg. Server 1 and Server 2
sp_addlinkedserver 'Server-2'
then copy your data from that server to your server by using following query
In Server-1 Write
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]
If you need an alternative without using Linked Servers, my favorite option is use the command line BCP utility.
With this bulk copy tool, you can export the data to a flat file, copy the file across the network and import it (load it) onto the target server.
https://learn.microsoft.com/en-us/sql/tools/bcp-utility

How to execute a SQL statement between two separate MySQL connections?

All, is there any means by which it is possible to connect to two separate MySQL databases and execute SQL statements to interact with both?
The aim would be to query DB 1 on connection 1 and insert the results into DB 2 on connection 2.
Is it possible to do this using the MySQL query browser?
I suppose there are two ways how to do this.
the first is manual : DB dump : " SELECT * INTO OUTFILE 'authors090308.sql' FROM authors; " and then "LOAD DATA INFILE 'authors090308.sql' INTO TABLE authors;" (you also need to specify some other parameters as to delimiting columns etc.) or by some other "database dump", where data goes into file the way you want. In between you must switch database manually to the second one.
the second is programmatic : with programming language : Then you need to just open two connections to the databases and realize the statements you need. I don't know if it is what you mean, you'd need to be more specific.
Anyway, you need a connection to a DB server, either via mysql client, oracle sql developer, mysql workbench or via mysql adapter/driver of a programming language. What you need, is the "glue" between 2 connections, which is the programming language. It's either a programming language or a file data is dumped into and back again.
I'm sorry but I don't thing there are any other ways of doing this...as to the first way, you can only get the output from a database and either use mysql pager and pipe the output somewhere (a file perhaps), or SELECT * INTO OUTFILE, mysqldump, mysqlhotcopy etc.