來源:http://www.study-code.com/dotnet/aspnet/67492.htm
1、資料庫要給存取權限,在我的電腦裡,右擊access資料庫,點擊“屬性”菜單,選“安全”選項卡,選擇Users組,賦給完全控制的許可權
如果沒有安全選項卡,點擊菜單“工具”->“檔案夾選項”,進入“查看”選項卡,把“使用簡單檔案分享權限設定”前的勾去掉
2、串連資料庫的時候,如果想要做到可以隨時更改資料庫的名稱,也不用重新編譯網站,就把資料庫的路徑記錄在web.config檔案裡:
<connectionStrings>
<add name="aceConnectionString" connectionString="目錄\\資料庫名稱.mdb" providerName="System.Data.OleDb" />
</connectionStrings>
使用這兩個方法取值:
public static string connectString = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
public static string GetDB()
{
return HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
}
在每個頁面,如果用到AccessDataSource控制項,這個控制項是不會自己讀取這個值的,可以在Page_Load頁面裡,使用AdsAd.DataFile = NnllClass.GetDB();給他賦值
protected void Page_Load(object sender, EventArgs e)
{
AdsAd.DataFile = NnllClass.GetDB();
}
3、如果使用AccessDataSource添加、刪除、修改記錄,要注意參數的問題,有一些網站,對一些參數報錯的資訊,給出的答案說access資料庫應該使用拼接的sql語句,不可以使用參數,這種說法是不對的,access資料庫也可以使用參數傳遞的方式增刪改查資料庫的
就是,因為vs.net 2005不可以像使用ms sql時一樣子,自動會檢索出參數,所以全部參數要自己手動添加,在添加參數的時候,要很小心,不要少了,也不要多了,也不要搞亂了順序
發現AccessDataSource控制項,好像是根據綁定欄位的順序來對應傳入的參數的,也就是說,如果你在FormView裡,是這樣子綁定的:
<asp:TextBox ID="myField1TextBox" runat="server" Text='<%# Bind("myField1") %>' MaxLength="20"></asp:TextBox>
<asp:TextBox ID="myField2TextBox" runat="server" Text='<%# Bind("myField2") %>' MaxLength="20"></asp:TextBox>
定義參數的時候,就應該這樣子定義:
<InsertParameters>
<asp:Parameter Name="myField1" Type="String" Size="20" ConvertEmptyStringToNull="False" />
<asp:Parameter Name="myField2" Type="String" Size="20" ConvertEmptyStringToNull="False" />
</InsertParameters>
次序不要搞亂了,搞亂了資料格式不同時,會報錯,具體的出錯資訊我忘記了
定義參數的時候,還有一個要注意的問題就是,參數名不要寫錯,參數不要寫漏
使用sql資料庫時,參數名不對,或者參數個數不對,都會得到很明顯的出錯資訊,就是,access資料庫,在這種時候,是不報錯的,如果參數名寫錯了,只會說有n個參數沒有值,如果是寫漏了參數,他有時候會直接替你更新資料庫,而更新的時候,是以綁定的順序來對應參數的值的,這時候,如果後面的參數值,大於前面的參數對應的欄位大小,就會得到“欄位太小”的出錯資訊
<InsertParameters>
<asp:Parameter Name="myField1" Type="String" Size="20" ConvertEmptyStringToNull="False" />
<asp:Parameter Name="myField2" Type="String" Size="20" ConvertEmptyStringToNull="False" />
</InsertParameters>
如果少了一個
<asp:Parameter Name="myField3" Type="String" Size="200" ConvertEmptyStringToNull="False" />
在更新的時候,會把myField3的值,寫進myField2裡,如果myField3的值的長度大於20,就會報“欄位太小”了
3、如果不習慣AccessDataSource控制項,那就自己綁定資料吧,給出一些方法:
#region 返回資料庫地址
public static string GetDB()
{
return HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
}
#endregion
#region 開啟資料庫:SqlConnection OpenConnect()
public OleDbConnection OpenConnect(Page aPage,bool setMsg)
{
try
{
OleDbConnection dbConnect = new OleDbConnection(connectString);
if (!dbConnect.State.Equals(ConnectionState.Open))
{
dbConnect.Open();
}
return dbConnect;
}
catch (OleDbException ex)
{
if (setMsg)
{
SetMsgJS(aPage.Master, "串連資料庫失敗:" + ex.Message.Replace("\n", "").Replace("\r", ""));
}
return null;
}
}
#endregion
#region 關閉資料庫:void CloseConnect(SqlConnection dbConnect)
public void CloseConnect(OleDbConnection dbConnect)
{
if (dbConnect.State.Equals(ConnectionState.Open))
{
dbConnect.Close();
}
}
#endregion
#region 讀取資料,返回DataSet
public DataSet GetDataSet(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, out string msg, bool setMsg)
{
msg = "";
//建立並設定SqlCommand
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//建立SqlDataAdapter並擷取資料
DataSet ds = new DataSet();
try
{
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);
dataAdapter.Fill(ds);
}
catch (InvalidOperationException eo)
{
msg = "讀取資料失敗:" + eo.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
catch (OleDbException ex)
{
msg = "讀取資料失敗:" + ex.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
//返回資料
return ds;
}
#endregion
#region 讀取資料,返回SqlDataReader
public OleDbDataReader GetDataReader(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, OleDbParameter[] p, out string msg, bool setMsg)
{
msg = "";
//設定命令
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//設定參數
if (p != null)
{
foreach (OleDbParameter pi in p)
{
dbCommand.Parameters.Add(pi);
}
}
//讀取第一個結果集
OleDbDataReader dbReader = null;
try
{
dbReader = dbCommand.ExecuteReader();
}
catch (InvalidOperationException eo)
{
msg = "讀取資料失敗:" + eo.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
catch (OleDbException ex)
{
msg = "讀取資料失敗:" + ex.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
return dbReader;
}
#endregion
#region 執行sql命令或預存程序
public int execCommand(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, OleDbParameter[] p, out string msg, bool setMsg)
{
bool needCloseDB = false;
int row = 0;
msg = "";
//建立並設定SqlConnection
if (dbConnection == null)
{
needCloseDB = true;
dbConnection = OpenConnect(aPage, setMsg);
if (dbConnection == null) return -1;
}
//建立並設定SqlCommand
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//設定參數
if (p != null)
{
foreach (OleDbParameter pi in p)
{
dbCommand.Parameters.Add(pi);
}
}
//執行命令
try
{
row = dbCommand.ExecuteNonQuery();
}
catch (InvalidOperationException eo)
{
msg = eo.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
row = -1;
}
catch (OleDbException ex)
{
//執行過程出錯
msg = ex.Message.Replace("\n", "").Replace("\r", "") + "\\n";
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
row = -1;
}
//關閉資料庫
if (needCloseDB)
{
CloseConnect(dbConnection);
}
return row;
}
#endregion
上面的方法都用到一個SetMsgJS方法,這個方法是用來給主版頁面設定資訊的
public static void SetMsgJS(MasterPage masterPage, string msg)
{
Literal lt = (Literal)masterPage.FindControl("LiteralMsg");
if (lt != null)
{
lt.Text += msg;
}
}
在主版頁面裡定義是這樣子的:
<script type="text/javascript">
var msg = "";
msg = "<asp:Literal ID="LiteralMsg" runat="server"></asp:Literal>";
if(msg != "")
{
alert(msg);
}
</script>