您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



asp.net 2.0下用access开发的时候要注意的问题
狼子 发表于 2007-11-24 18:15:00 阅读全文 | 回复(0) | 引用通告 | 编辑

很烦很烦,做的时候,烦到很难过很难受

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>

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.