mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
* Uses MySQL Connector/NET from nuget * Adds SQL Server type to configuration. * Hostname for MySQL connections can include port - Format: <hostname>[:<port>] * Abstracted a bundle of stuff to be generic for both MSSQL and MySQL, including a number of variable and method names. (Mostly went from "sql..." -> "db..." * Changed MiscTools.DBDate() string building for MSSQL, uses DateTime.ToString() with a format which seemed simpler. * Unsure about which lines in .csproj are actually required, and which are auto-munged by Visual Studio. * ... This is my first C# (and VS!) work, be gentle! Signed-off-by: Mike Beattie <mike@ethernal.org>
95 lines
3.5 KiB
C#
95 lines
3.5 KiB
C#
using System.Data;
|
|
using mRemoteNG.Config.DatabaseConnectors;
|
|
using mRemoteNG.Messages;
|
|
using mRemoteNG.App;
|
|
using MySql.Data.MySqlClient;
|
|
using System.Data.SqlClient;
|
|
|
|
namespace mRemoteNG.Config.DataProviders
|
|
{
|
|
public class SqlDataProvider : IDataProvider<DataTable>
|
|
{
|
|
public IDatabaseConnector DatabaseConnector { get; }
|
|
|
|
public SqlDataProvider(IDatabaseConnector databaseConnector)
|
|
{
|
|
DatabaseConnector = databaseConnector;
|
|
}
|
|
|
|
public DataTable Load()
|
|
{
|
|
var dataTable = new DataTable();
|
|
var dbQuery = DatabaseConnector.DbCommand("SELECT * FROM tblCons ORDER BY PositionID ASC");
|
|
DatabaseConnector.AssociateItemToThisConnector(dbQuery);
|
|
if (!DatabaseConnector.IsConnected)
|
|
OpenConnection();
|
|
var dbDataReader = dbQuery.ExecuteReader(CommandBehavior.CloseConnection);
|
|
|
|
if (dbDataReader.HasRows)
|
|
dataTable.Load(dbDataReader);
|
|
dbDataReader.Close();
|
|
return dataTable;
|
|
}
|
|
|
|
public void Save(DataTable dataTable)
|
|
{
|
|
if (DbUserIsReadOnly())
|
|
{
|
|
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg,
|
|
"Trying to save connections but the SQL read only checkbox is checked, aborting!");
|
|
return;
|
|
}
|
|
|
|
if (!DatabaseConnector.IsConnected)
|
|
OpenConnection();
|
|
if (DatabaseConnector.GetType() == typeof(MSSqlDatabaseConnector))
|
|
{
|
|
using (var sqlBulkCopy = new SqlBulkCopy((SqlConnection)DatabaseConnector.DbConnection()))
|
|
{
|
|
foreach (DataColumn col in dataTable.Columns)
|
|
sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
|
|
sqlBulkCopy.DestinationTableName = "dbo.tblCons";
|
|
sqlBulkCopy.WriteToServer(dataTable);
|
|
}
|
|
|
|
}
|
|
else if (DatabaseConnector.GetType() == typeof(MySqlDatabaseConnector))
|
|
{
|
|
var dbConnection = (MySqlConnection) DatabaseConnector.DbConnection();
|
|
using (MySqlTransaction transaction = dbConnection.BeginTransaction(System.Data.IsolationLevel.Serializable))
|
|
{
|
|
using (MySqlCommand sqlCommand = new MySqlCommand())
|
|
{
|
|
sqlCommand.Connection = dbConnection;
|
|
sqlCommand.Transaction = transaction;
|
|
sqlCommand.CommandText = "SELECT * FROM tblCons";
|
|
using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(sqlCommand))
|
|
{
|
|
dataAdapter.UpdateBatchSize = 1000;
|
|
using (MySqlCommandBuilder cb = new MySqlCommandBuilder(dataAdapter))
|
|
{
|
|
dataAdapter.Update(dataTable);
|
|
transaction.Commit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OpenConnection()
|
|
{
|
|
DatabaseConnector.Connect();
|
|
}
|
|
|
|
public void CloseConnection()
|
|
{
|
|
DatabaseConnector.Disconnect();
|
|
}
|
|
|
|
private bool DbUserIsReadOnly()
|
|
{
|
|
return mRemoteNG.Settings.Default.SQLReadOnly;
|
|
}
|
|
}
|
|
} |