Google Gears SQLite DB 和 C#
Posted
技术标签:
【中文标题】Google Gears SQLite DB 和 C#【英文标题】:Google Gears SQL Lite DB and C# 【发布时间】:2010-10-09 20:59:35 【问题描述】:在幕后,Google Gears 使用 SQL Lite 作为其数据存储。有没有人使用 C# 成功连接到 Google Gears SQL Lite DB?
谢谢
【问题讨论】:
【参考方案1】:看看我最喜欢的SQLite ADO.NET Wrapper,我个人在很多项目中都使用它。我想,Google Gears 使用的是默认 SQLite 数据库,并在代码中进行了一些修改,以防止 ATTACH 和#PRAGMA 使用。但是数据格式应该是相同的,所以你应该能够使用这个包装器来访问它。
最好的问候, 马丁
【讨论】:
【参考方案2】://所以会这样使用它: //
public bool RunProcGetDs (ref string msg, string domainName, string procedureName, ref DataSet ds)
#region Action
try
using (Database db = new Database ( _ConnectionString ))
DbCommand cmd = db.GetStoredProcedureCommand ( procedureName );
db.AddInParam ( cmd, "@domain_user", DbType.String, (object)domainName );
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "METHOD START --- MetaDbControl.cs RunProcGetDs + \n" );
ds = db.ExecuteDataSet ( cmd );
Utils.Debugger.DebugDataSet("from RunProcGetDs ", ref ds);
//debug msg = "Select the values for your reports";
return true;
//eof using
//eof try
#endregion Action
#region CatchExceptionsAdv4
catch (NullReferenceException nre)
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += nre.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof 捕获
catch (System.InvalidOperationException ioe) //comm -- occurs when no result set was found !!!
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += ioe.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof catch (System.InvalidOperationException)
catch (System.IndexOutOfRangeException ioore) //comm -- occurs when no result set was found !!!
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += ioore.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof 捕获 (System.IndexOutOfRangeException)
catch (System.Data.SqlClient.SqlException sqle)
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += sqle.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof 捕获
catch (System.FormatException fe)
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += fe.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof 捕获
catch (Exception ex)
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
string methodName = st.GetFrame ( 1 ).GetMethod ().Name;
string className = st.GetFrame ( 1 ).GetFileName ();
int lineNumber = st.GetFrame ( 1 ).GetFileLineNumber ();
string encryptedErrorCode = String.Empty;
encryptedErrorCode += "className - " + className + " methodName ";
encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString ();
encryptedErrorCode += userObj.DomainName;
if (System.Convert.ToInt16 ( BL.Conf.Instance.Vars["EncryptErrorMessages"] ) == 1)
encryptedErrorCode = Utils.DataEncryption.EncryptString ( encryptedErrorCode, userObj.DomainName );
userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode;
userObj.Mc.ClassName += className + " ; " ;
userObj.Mc.MethodName += methodName + " ; " ;
userObj.Mc.DebugMsg += ex.Message;
if (DbDebugger.DebugAppError ( ref userObj ) == false)
userObj.Mc.Msg = "Failed to debug application error at " + methodName;
GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 返回假; //eof 捕获 #endregion CatchExceptionsAdv4
//eof method
【讨论】:
【参考方案3】://你好,试试这个:
//Courtesy of http://www.codoxide.com/post/My-Favorite-Database-Wrapper-for-C.aspx
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
namespace GenApp.Core.Providers.nsDb
//comm -- / <summary>
//comm -- / Abstract base class for encapsulating provider independant database interactin logic.
//comm -- / </summary>
//comm -- / <typeparam name="CONNECTION_TYPE"><see cref="DbConnection"/> derived Connection type.</typeparam>
//comm -- / <typeparam name="COMMAND_TYPE"><see cref="DbCommand"/> derived Command type.</typeparam>
//comm -- / <typeparam name="ADAPTER_TYPE"><see cref="DbDataAdapater"/> derived Data Adapter type.</typeparam>
public abstract
class AbstractDatabase<CONNECTION_TYPE, COMMAND_TYPE, ADAPTER_TYPE> : IDisposable
where CONNECTION_TYPE : DbConnection, new()
where COMMAND_TYPE : DbCommand
where ADAPTER_TYPE : DbDataAdapter, new()
#region : Connection :
//comm -- / <summary>Gets the Connection object associated with the current instance.</summary>
public DbConnection Connection
get
if (internal_currentConnection == null)
internal_currentConnection = new CONNECTION_TYPE();
// - Enable to measure the connection timeGenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "GetConnectionString START" );
internal_currentConnection.ConnectionString = GetConnectionString();
// - Enable to measure the connection timeGenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "GetConnectionString END" );
return internal_currentConnection;
private DbConnection internal_currentConnection;
//comm -- / <summary>When overridden in derived classes returns the connection string for the database.</summary>
//comm -- / <returns>The connection string for the database.</returns>
protected abstract string GetConnectionString();
#endregion
#region : Commands :
//comm -- / <summary>Gets a DbCommand object with the specified <see cref="DbCommand.CommandText"/>.</summary>
//comm -- / <param name="sqlString">The SQL string.</param>
//comm -- / <returns>A DbCommand object with the specified <see cref="DbCommand.CommandText"/>.</returns>
public DbCommand GetSqlStringCommand(string sqlString)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
DbCommand cmd = this.Connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sqlString;
return cmd;
//comm -- / <summary>Gets a DbCommand object with the specified <see cref="DbCommand.CommandText"/>.</summary>
//comm -- / <param name="sqlStringFormat">The SQL string format.</param>
//comm -- / <param name="args">The format arguments.</param>
//comm -- / <returns>A DbCommand object with the specified <see cref="DbCommand.CommandText"/>.</returns>
public DbCommand GetSqlStringCommand(string sqlStringFormat, params object[] args)
return GetSqlStringCommand(string.Format(sqlStringFormat, args));
//comm -- / <summary>Gets a DbCommand object for the specified Stored Procedure.</summary>
//comm -- / <param name="storedProcName">The name of the stored procedure.</param>
//comm -- / <returns>A DbCommand object for the specified Stored Procedure.</returns>
public DbCommand GetStoredProcedureCommand(string storedProcName)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
DbCommand cmd = this.Connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storedProcName;
return cmd;
#region : Parameters :
//comm -- / <summary>Adds an input parameter to the given <see cref="DbCommand"/>.</summary>
//comm -- / <param name="cmd">The command object the parameter should be added to.</param>
//comm -- / <param name="paramName">The identifier of the parameter.</param>
//comm -- / <param name="paramType">The type of the parameter.</param>
//comm -- / <param name="value">The value of the parameter.</param>
//comm -- / <returns>The <see cref="DbParameter"/> that was created.</returns>
public DbParameter AddInParam(DbCommand cmd, string paramName, DbType paramType, object value)
DbParameter param = cmd.CreateParameter();
param.DbType = paramType;
param.ParameterName = paramName;
param.Value = value;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add( param );
return param;
//eof method AddInParam
//comm -- / <summary>Adds an input parameter to the given <see cref="DbCommand"/>.</summary>
//comm -- / <param name="cmd">The command object the parameter should be added to.</param>
//comm -- / <param name="paramName">The identifier of the parameter.</param>
//comm -- / <param name="paramType">The type of the parameter.</param>
//comm -- / <param name="size">The maximum size in bytes, of the data table column to be affected.</param>
//comm -- / <param name="value">The value of the parameter.</param>
//comm -- / <returns>The <see cref="DbParameter"/> that was created.</returns>
public DbParameter AddInParam(DbCommand cmd, string paramName, DbType paramType, int size, object value)
DbParameter param = cmd.CreateParameter();
param.DbType = paramType;
param.ParameterName = paramName;
param.Size = size;
param.Value = value;
param.Direction = ParameterDirection.Input;
//debugGenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "Adding IN param " + value.ToString ( ) );
cmd.Parameters.Add(param);
return param;
public DbParameter AddInOutParam ( DbCommand cmd, string paramName, DbType paramType, int size, object value )
DbParameter param = cmd.CreateParameter ( );
param.DbType = paramType;
param.ParameterName = paramName;
param.Size = size;
param.Value = value;
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add ( param );
//debug if needed here
return param;
public DbParameter AddInOutParam ( DbCommand cmd, string paramName, DbType paramType, object value )
DbParameter param = cmd.CreateParameter ( );
param.DbType = paramType;
param.ParameterName = paramName;
param.Value = value;
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add ( param );
return param;
#endregion
#region : Executes :
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public int ExecuteNonQuery(DbCommand cmd)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
return cmd.ExecuteNonQuery();
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <param name="txn">The database transaction inside which the command should be executed.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public int ExecuteNonQuery(DbCommand cmd, DbTransaction txn)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
cmd.Transaction = txn;
return cmd.ExecuteNonQuery();
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public DbDataReader ExecuteReader(DbCommand cmd)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
return cmd.ExecuteReader();
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <param name="behavior">One of the <see cref="System.Data.CommandBehavior"/> values.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public DbDataReader ExecuteReader(DbCommand cmd , CommandBehavior behavior )
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
return cmd.ExecuteReader(behavior);
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public T ExecuteScalar<T>(DbCommand cmd, T defaultValue)
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
object retVal = cmd.ExecuteScalar();
if (null == retVal || DBNull.Value == retVal)
return defaultValue;
else
return (T)retVal;
//comm -- / <summary>Executes the specified command against the current connection.</summary>
//comm -- / <param name="cmd">The command to be executed.</param>
//comm -- / <returns>Result returned by the database engine.</returns>
public DataSet ExecuteDataSet(DbCommand cmd)
ADAPTER_TYPE adapter = new ADAPTER_TYPE();
adapter.SelectCommand = (COMMAND_TYPE)cmd;
DataSet retVal = new DataSet();
adapter.Fill(retVal);
return retVal;
////comm -- / <summary>Executes the specified command against the current connection.</summary>
////comm -- / <param name="cmd">The command to be executed.</param>
////comm -- / <returns>Result returned by the database engine.</returns>
//public DataSet ExecuteDataSet(DbCommand cmd )
//
// ADAPTER_TYPE adapter = new ADAPTER_TYPE();
// adapter.SelectCommand = (COMMAND_TYPE)cmd;
// //cmd.CommandTimeout = 3600
// DataSet retVal = new DataSet();
// adapter.Fill(retVal);
// return retVal;
//
#endregion
#endregion
//comm -- / <summary>Begins a transaction.</summary>
//comm -- / <returns>Created transaction.</returns>
public DbTransaction BeginTransaction()
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();
return Connection.BeginTransaction();
#region : Construction / Destruction :
//comm -- / <summary>Disposes the resources associated with the current database connection.</summary>
~AbstractDatabase()
Dispose();
#region IDisposable Members
//comm -- / <summary>Disposes the resources associated with the current database connection.</summary>
public void Dispose()
if (null != internal_currentConnection)
internal_currentConnection.Dispose();
internal_currentConnection = null;
#endregion
#endregion
//eof public abstract class AbstractDatabase
//eof namespace Providers.nsDb
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace GenApp.Core.Providers.nsDb
public class Database : AbstractDatabase<SqlConnection, SqlCommand, SqlDataAdapter>
private string _ConnectionString;
public string ConnectionString
get return _ConnectionString;
set _ConnectionString = value;
//eof property FieldName
public Database ( string connectionStr )
//debugGenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf(ref userObj , " CHECK --- nsDb.Database using the following connection string " + connectionStr);
this.ConnectionString = connectionStr;
//eof constructor
protected override string GetConnectionString ( )
//GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "In GetConnectionString the ConnectionString is " + this.ConnectionString );
//GenApp.Core.Providers.nsDbMeta.DbDebugger.WriteIf ( ref userObj , "The comming fromURL IS " + commingFromURL );
return this._ConnectionString;
//eof protected override string GetConnectionString()
//eof class
//eof namespace Providers.nsDb
【讨论】:
请注意,该大代码上的处置模式实现已损坏,您不应在通过终结器处置时处置托管资源。以上是关于Google Gears SQLite DB 和 C#的主要内容,如果未能解决你的问题,请参考以下文章
Google Gears 和 jQuery 创建 managedStore 的问题
如何在 Firefox 4 上运行 Google Gears 扩展?