我是asp.net的新手,所以这可能是一个非常基本的问题,但我无法弄明白.
我在互联网上找到了一些连接到数据库的代码.我创建了一个名称空间和一些类,以便在不同的项目中使用相同的代码.
代码和我的类如下:
namespace databaseFunctions { public class databaseConnection { private static string databaseConnectionString() { return "DRIVER={MysqL ODBC 5.1 Driver}; ........"; } public static DataTable getFromDatabase(string sql) { DataTable rt = new DataTable(); DataSet ds = new DataSet(); OdbcDataAdapter da = new OdbcDataAdapter(); OdbcConnection con = new OdbcConnection(databaseConnectionString()); OdbcCommand cmd = new OdbcCommand(sql,con); da.SelectCommand = cmd; da.Fill(ds); try { rt = ds.Tables[0]; } catch { rt = null; } return rt; } public static Boolean insertIntoDatabase(string sql) { OdbcDataAdapter da = new OdbcDataAdapter(); OdbcConnection con = new OdbcConnection(databaseConnectionString()); OdbcCommand cmd = new OdbcCommand(sql,con); con.Open(); try { cmd.ExecuteNonQuery(); return true; } catch { return false; } } }
从数据库获取数据或将数据插入某个数据库没有问题.
但.当我尝试从MysqL数据库中获取last_insert_id()时.我只得到零.
这就是为什么我认为我创建并从互联网上复制的这段代码,每次调用“getFromDatabase(sql)”时都会创建一个新连接
是否有人可以帮我修复这个类getFromDatabase()以保持数据库连接活着,直到我告诉程序放弃连接?
我想这是应该更改的“新OdbcConnection”?是否可以检查是否已存在连接?
我已经在经典的asp中完成了数百次,但是现在,有了类和东西.我完全迷失了.
解决方法
您遇到的问题是您已将自己编码为“每个操作的新连接”角落.您真正想要的目标是“每批操作的新连接”,并被认为是最佳实践.
在这种情况下,我建议在需要时打开连接,在处理时关闭.我们要做的是将odbc适配器移动到更大的范围变量,以便可以在类中访问它.
namespace databaseFunctions { public class databaseConnection:IDisposable { private OdbcConnection con; private string connectionString; public databaseConnection(string connectionString){ this.connectionString = connectionString; } public void OpenConnection(){ if (con == null || con.IsClosed ){ // we make sure we're only opening connection once. con = new OdbcConnection(this.connectionString); } } public void CloseConnection(){ if (con != null && con.IsOpen){ // I'm making stuff up here con.Close(); } } public DataTable getFromDatabase(string sql) { OpenConnection(); DataTable rt = new DataTable(); DataSet ds = new DataSet(); OdbcCommand cmd = new OdbcCommand(sql,con); da.SelectCommand = cmd; da.Fill(ds); try { rt = ds.Tables[0]; } catch { rt = null; } return rt; } public Boolean insertIntoDatabase(string sql) { OpenConnection(); OdbcCommand cmd = new OdbcCommand(sql,con); con.Open(); try { cmd.ExecuteNonQuery(); return true; } catch { return false; } } // Implementing IDisposable method public void Dispose(){ CloseConenction(); } } }
现在,下次你使用你的班级做类似的事情
using (DatabaseConnection db = new DatabaseConnection()){ db.InsertIntoDatabase(...); db.GetLastInsertID(); db.GetFromDatabase(...); }
在该代码块的末尾,因为它是IDisposeable,它将在dispose方法中为您关闭该连接.
我改变的事情:
>实现了IDisposable接口
>将方法从静态更改为类方法.
>添加了打开关闭连接的新方法
>将连接变量移动到类级别范围
>在构造函数中添加了一个参数,允许您传入连接字符串(您应该将此连接字符串放在Web.Config中)
编辑:
>构造函数根据建议接受connectionString.