好多朋友被ACCESS資料庫在.net程式中相對路徑的問題困擾,搞得每次移動程式都要去修改web.config
中資料庫連接字串的資料庫路徑。
好多人的web.config中的寫法如下:
<appSettings>
<add key="OLEDBCONNECTIONSTRING" value="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=E:\web\App_Data\Data.mdb)"></add>
</appSettings>
程式中這樣寫:
MyConn = new OleDbConnection(System.Configuration.ConfigurationManager.AppSettings["OLEDBCONNECTIONSTRING"]); //注釋一下:VS2005和VS2003中的ConfigurationSettings寫法不一樣,具體區別自己查吧
這樣程式運行時經常提示諸如以下的錯誤:
'C:\WINDOWS\system32\~\App_Data\Data.mdb'不是一個有效路徑。 確定路徑名稱拼字是否正確,以及是否串連到檔案存放的伺服器。 Data Source=~\App_Data\Data.mdb
就算用絕對路徑正確,那麼移植程式時還要去修改web.config,所以比較麻煩。
也有在web.config中使用象ASP那樣的Server.MapPath取資料庫路徑的,但web.config不認識Server.MapPath,此方法也行不通。
後來通過摸索、參考其它程式,總結出如下方法,可以方便的移植程式路徑而不必再去修改ACCESS資料庫路徑。
我在web.config中的寫法如下:
<appSettings>
<add key="SQLConnString" value="provider=microsoft.jet.oledb.4.0;data source="/>
<add key="dbPath" value="~/App_Data/mydata.mdb"/>
</appSettings>
程式中的資料訪問類中我把"SQLConnString"和"dbPath"取出來串連成一個字串"CONN_STRING_NON_DTC"
public static readonly string CONN_STRING_NON_DTC = System.Configuration.ConfigurationManager.AppSettings["SQLConnString"].ToString() + System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["dbPath"]) + ";";
End of《ASP.NET串連ACCESS資料庫web.config內路徑最優寫法
文章二web.config 配置access的相對路徑
本人使用的是VS 2005,經過調試成功,具體如何?,代碼如下(VB.Net樣本,C#方法一樣,在這裡就不用說了)
首先在web.config檔案<appSettings>節點中加入如下代碼:
<!--資料來源-->
<add key="myds" value="Provider=Microsoft.Jet.OLEDB.4.0;Data source="/>
<!--資料庫相對路徑-->
<add key="myconn" value="App_Data\VinikeData.mdb"/>
然後,寫個類檔案,調用上面的定義,代碼如下:
'定義一個連接字串,痛點就在這裡,網上很多用到了Server.MapPath,但是還是不行,注意這裡用到了Request.MapPath(相對asp來說,這是asp所沒用的)
Public connstr As String = ConfigurationSettings.AppSettings("myds") + HttpContext.Current.Request.MapPath("~") + (ConfigurationSettings.AppSettings("myconn").Trim())
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
/// <summary>
/// Connection 的摘要說明
/// </summary>
public class Connection
{
public Connection()
{
//
// TODO: 在此處添加建構函式邏輯
//
}
public static OleDbConnection connAccess()
{
OleDbConnection conn = new OleDbConnection(GetConnString());
return conn;
}
private static string GetConnString()
{
return System.Configuration.ConfigurationSettings.AppSettings["ConnStr"] + System.Web.HttpContext.Current.Server.MapPath("~")+System.Configuration.ConfigurationSettings.AppSettings["DbPath"];
}
}
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
public partial class test_sss_Defauldddt : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
System.Data.OleDb.OleDbConnection conn1 = Connection.connAccess();
conn1.Open();
if (conn1.State == ConnectionState.Open)
{
Label1.Text = "串連成功!";
}
else
{
Label1.Text = "串連不成功!";
}
}
}
文章三c#2.0中web.config中調用Access資料庫語句
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings/>
<connectionStrings>
<add name="book" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\c#\book\App_Data\book.mdb"
providerName="System.Data.OleDb" />
</connectionStrings>
調用資料庫類:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//因為要使用Access資料庫,所以這裡得引入命名空間
using System.Data.OleDb;
/// <summary>
/// 這裡主要是留言本會用到的資料庫連接類,因為資料操作並不多,所以把常規的操作類也一併放這裡了
/// </summary>
public class odb
{
public string name;
public string email;
public string qq;
public string msn;
public string url;
public string title;
public string concent;
public string face;
public string ip;
public string pwd;
public string uid;
public string pwda;
public DateTime dtt;
public odb()
{
//
// TODO: 在此處添加建構函式邏輯
//
}
public static OleDbConnection con()
{//資料庫連接類
OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["book"].ConnectionString);
return con;
}
public static bool insert(string que)
{ //根據傳進來的SQL語句執行插入/刪除/更新等操作
OleDbConnection con = odb.con();
con.Open();
OleDbCommand cmd = new OleDbCommand(que,con);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
if (count > 0)
return true;
else
return false;
}
public static DataTable ds(string que)
{//返回一個裝載了SQL制定留言的資料表,
OleDbConnection con = odb.con();
OleDbDataAdapter oda = new OleDbDataAdapter();
oda.SelectCommand=new OleDbCommand(que,con);
DataSet ds = new DataSet();
oda.Fill(ds,"thc");
return ds.Tables["thc"];
}
public static bool img(string que)
{//根據傳來的條件查詢該項是否有內容,有就返回true
OleDbConnection con = odb.con();
con.Open();
OleDbCommand cmd = new OleDbCommand(que,con);
if (cmd.ExecuteScalar().ToString() != "")
return true;
else
return false;
con.Close();
}
public static string scr(string que)
{//同樣是根據傳來的SQL語句返回一個欄位的值,一般應該把SQL語句做在類中,這裡沒有放
OleDbConnection con = odb.con();
con.Open();
OleDbCommand cmd = new OleDbCommand(que,con);
return cmd.ExecuteScalar().ToString();
}
public static int num(string mm)
{//根據要求返回一個一個顯示條目數
return Convert.ToInt32(odb.scr("select ["+mm+"] from [config]"));
}
}
文章四asp.net 做登入介面如何串連access資料庫進行驗證
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
public partial class login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//以下產生隨機的驗證碼,並在label1顯示
Random ro = new Random();
if (!IsPostBack)
{
this.Label1.Text = ro.Next(1000, 9999).ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (this.name.Text != "")//判斷使用者名稱是否未空
{
if (this.pwd.Text != "")//判斷密碼是否未空
{
if (this.yanzhen1.Text != "")//判斷驗證碼是否未空
{
if (this.yanzhen1.Text == this.Label1.Text)//判斷驗證碼是否相等
{
string sql;
sql = "select count(*) from userinfo where username='" + this.name.Text + "' and pwd='" + this.pwd.Text + "'";//建立sql查詢語句
try
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("./app_data/db.mdb"));//建立資料庫連接
conn.Open();
OleDbCommand cmd = new OleDbCommand(sql, conn);
int state =Convert.ToInt32( cmd.ExecuteScalar());//執行sql語句,並返回獲得值
if (state == 0 || state > 1)//如果資料中沒有記錄或有多條記錄則抱錯
{
this.Label2.Text = "使用者不存在,請檢測使用者名稱和密碼是否正確!";
}
else
{
this.Label2.Text = "登入成功!" ;
}
conn.Close();
}
catch (Exception a)
{
Response.Writea.Message);
}
}
else
{
this.Label2.Text = "驗證碼不正確,請重新輸入!";
}
}
else
{
this.Label2.Text = "驗證碼沒有填寫!";
}
}
else
{
this.Label2.Text = "密碼沒有填寫!";
}
}
else
{
this.Label2.Text = "使用者名稱沒有填寫!";
}
}
}