1. tree is being stored in the database with tree info stored in master. 2. the id and data orderings are consistent and this has been checked. 3. SQLInterface class has been added.
194 lines
8.7 KiB
C#
194 lines
8.7 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Data.SqlClient;
|
|
using System.Data;
|
|
using StructureInterfaces;
|
|
|
|
|
|
namespace Utilities
|
|
{
|
|
/// <summary>
|
|
/// Bulk Reader to help write large amounts of data to the
|
|
/// sql server fast.
|
|
/// </summary>
|
|
public abstract class SqlBulkCopyReader : IDataReader
|
|
{
|
|
// derived must implement only these three
|
|
public abstract bool Read();
|
|
public abstract object GetValue(int i);
|
|
public abstract int FieldCount { get; }
|
|
|
|
// empty methods derived classes may want to implement
|
|
public virtual void Close() { }
|
|
public virtual void Dispose() { }
|
|
public virtual int GetOrdinal(string name) { throw new NotImplementedException(); }
|
|
public virtual object this[int i] { get { throw new NotImplementedException(); } }
|
|
public virtual int Depth { get { throw new NotImplementedException(); } }
|
|
public virtual bool IsClosed { get { throw new NotImplementedException(); } }
|
|
public virtual int RecordsAffected { get { throw new NotImplementedException(); } }
|
|
public virtual DataTable GetSchemaTable() { throw new NotImplementedException(); }
|
|
public virtual bool NextResult() { throw new NotImplementedException(); }
|
|
public virtual object this[string name] { get { throw new NotImplementedException(); } }
|
|
public virtual bool GetBoolean(int i) { throw new NotImplementedException(); }
|
|
public virtual byte GetByte(int i) { throw new NotImplementedException(); }
|
|
public virtual long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) { throw new NotImplementedException(); }
|
|
public virtual char GetChar(int i) { throw new NotImplementedException(); }
|
|
public virtual long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) { throw new NotImplementedException(); }
|
|
public virtual IDataReader GetData(int i) { throw new NotImplementedException(); }
|
|
public virtual string GetDataTypeName(int i) { throw new NotImplementedException(); }
|
|
public virtual DateTime GetDateTime(int i) { throw new NotImplementedException(); }
|
|
public virtual decimal GetDecimal(int i) { throw new NotImplementedException(); }
|
|
public virtual double GetDouble(int i) { throw new NotImplementedException(); }
|
|
public virtual Type GetFieldType(int i) { throw new NotImplementedException(); }
|
|
public virtual float GetFloat(int i) { throw new NotImplementedException(); }
|
|
public virtual Guid GetGuid(int i) { throw new NotImplementedException(); }
|
|
public virtual short GetInt16(int i) { throw new NotImplementedException(); }
|
|
public virtual int GetInt32(int i) { throw new NotImplementedException(); }
|
|
public virtual long GetInt64(int i) { throw new NotImplementedException(); }
|
|
public virtual string GetName(int i) { throw new NotImplementedException(); }
|
|
public virtual string GetString(int i) { throw new NotImplementedException(); }
|
|
public virtual int GetValues(object[] values) { throw new NotImplementedException(); }
|
|
public virtual bool IsDBNull(int i) { throw new NotImplementedException(); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// This class provides all the database utilities needed by the system.
|
|
/// Funtionality includes returning the data from tables, returning
|
|
/// table sizes, dimensions etc.
|
|
/// </summary>
|
|
public sealed class DatabaseUtilities
|
|
{
|
|
public static int TIMEOUT = 600;
|
|
|
|
// DEBUGGING ELEMENTS
|
|
private static TextWriterTraceListener Tracer =
|
|
new TextWriterTraceListener("C:\\Documents and Settings\\manyu\\Desktop\\trace.txt");
|
|
static DateTime startTime = DateTime.Now;
|
|
static DateTime endTime = DateTime.Now;
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// This function returns the data from the table in row major order.
|
|
/// It also returns the row count and dimensionality. Note the first column is
|
|
/// currently assumed to be the id column and this information is not returned
|
|
///
|
|
/// </summary>
|
|
/// <param name="dbName"></param>
|
|
/// <param name="tableName"></param>
|
|
/// <param name="rowCount"></param>
|
|
/// <returns></returns>
|
|
public static void GetTableData(String dbName, String tableName,
|
|
out int[] ids, out double[] data )
|
|
{
|
|
/**
|
|
* open connection to database
|
|
*/
|
|
Trace.Listeners.Add(Tracer);
|
|
Trace.WriteLine("DatabaseUtilities.GetTableData()");
|
|
SqlConnection connection = new SqlConnection();
|
|
//connection.ConnectionString = "Context Connection=true";
|
|
connection.ConnectionString = "Data Source=KLEENE; Initial Catalog=NNTest; Integrated Security=True;";
|
|
startTime = DateTime.Now;
|
|
connection.Open();
|
|
endTime = DateTime.Now;
|
|
Trace.WriteLine("DatabaseUtilities.GetTableData()- Getting DB Connection took " + PrintTime());
|
|
|
|
/**
|
|
* get the number of rows in the table
|
|
*/
|
|
startTime = DateTime.Now;
|
|
int rowCount = GetNumberOfRows(connection, dbName, tableName);
|
|
endTime = DateTime.Now;
|
|
Trace.WriteLine("DatabaseUtilities.GetTableData()- Getting row count took " + PrintTime());
|
|
|
|
/**
|
|
* Execute select query
|
|
*/
|
|
SqlCommand cmd = new SqlCommand();
|
|
cmd.CommandText = "SELECT * FROM " + dbName + ".dbo." + tableName;
|
|
cmd.CommandType = System.Data.CommandType.Text;
|
|
cmd.Connection = connection;
|
|
startTime = DateTime.Now;
|
|
SqlDataReader rdr = cmd.ExecuteReader();
|
|
endTime = DateTime.Now;
|
|
Trace.WriteLine("DatabaseUtilities.GetTableData()- Executing Select Statement took" + PrintTime());;
|
|
|
|
/**
|
|
* ITERATE
|
|
*/
|
|
int N = rdr.VisibleFieldCount - 1; // assuming that 1 column is the id
|
|
ids = new int[rowCount];
|
|
data = new double[rowCount * N];
|
|
object[] rowData = new object[N+1];
|
|
startTime = DateTime.Now;
|
|
unsafe
|
|
{
|
|
fixed (double* dataPtr = data)
|
|
{
|
|
fixed(int* idPtr = ids)
|
|
{
|
|
double *dt = dataPtr;
|
|
int* id = idPtr;
|
|
while (rdr.Read())
|
|
{
|
|
rdr.GetValues(rowData);
|
|
*id = (int)rowData[0];
|
|
++id;
|
|
for (int i = 0; i < N; ++i)
|
|
{
|
|
*dt = (double)rowData[i + 1];
|
|
++dt;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
endTime = DateTime.Now;
|
|
Trace.WriteLine("DatabaseUtilities.GetTableData()- Iterating took " + PrintTime());
|
|
|
|
/**
|
|
* Release resources.
|
|
*/
|
|
rdr.Close();
|
|
connection.Close();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the number of rows in the table.
|
|
/// </summary>
|
|
/// <param name="connection"></param>
|
|
/// <param name="dbName"></param>
|
|
/// <param name="tableName"></param>
|
|
/// <returns></returns>
|
|
private static int GetNumberOfRows(SqlConnection connection, String dbName, String tableName)
|
|
{
|
|
SqlCommand cmd = new SqlCommand();
|
|
cmd.Connection = connection;
|
|
// get the number of rows in the table
|
|
cmd.CommandText = "SELECT count(*) FROM " + dbName + ".dbo."+ tableName;
|
|
cmd.CommandType = System.Data.CommandType.Text;
|
|
cmd.CommandTimeout = TIMEOUT;
|
|
SqlDataReader rdr = cmd.ExecuteReader();
|
|
rdr.Read();
|
|
int rowCount = rdr.GetInt32(0);
|
|
rdr.Close();
|
|
return rowCount;
|
|
}
|
|
|
|
private static String PrintTime()
|
|
{
|
|
TimeSpan duration = endTime - startTime;
|
|
/*
|
|
return
|
|
duration.Hours
|
|
+ ":" + duration.Minutes
|
|
+ ":" + duration.Seconds + "." + duration.Milliseconds;
|
|
*/
|
|
return duration.Ticks.ToString();
|
|
}
|
|
|
|
//public static void StoreTree(String dbName, String tableName,
|
|
}
|
|
}
|