none
使用 OleDb 向 Access 数据库写入记录时遇到的奇怪问题 RRS feed

  • 问题

  • 大家好,我最近在使用 ASP.NET 做一个小项目(业余),因为很长时间没有用过 Access 数据库了(一般都是使用 SQL Server 或 MySQL),考虑到这个项目非常小,所以采用了 Access。目前遇到的一个问题就是,使用 OleDbCommand 插入数据以后,Access 数据库内的记录中的数据类型为 文本 的字段的值会自动使用空格补齐至其定义的最大长度,例如:

    字段___类型___长度
    Foo____文本___10

    插入 Bar 这个值
    理论上插入的值应该是

    Bar

    而实际上数据库里保存的值是

    Bar_______

    即后面有7个空格

    我查阅了 MSDN,微软帮助与支持,也通过 Google 及 Bing 搜索,看到也有其他人遇到这个问题,但是都没有看到有解决方案,特此向大家请教。

    以下附上部分数据访问逻辑的代码片段:

           public static bool AddHost(WebHostInfo hostInfo)
            {
                OleDbConnection con = new OleDbConnection();
                OleDbCommand cmd = new OleDbCommand();
                OleDbParameter pararm = new OleDbParameter("@ViewUri", OleDbType.VarWChar);
                con.ConnectionString = DataAccess.ConnectionString;
                con.Open();
                cmd.Connection = con;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = SQL_QUERYHOST_URI;
                pararm.Value = hostInfo.Url;
                cmd.Parameters.Add(pararm);
    
                object hostId = cmd.ExecuteScalar();
    
                // 查询指定的 URL 是否已被使用
                if (hostId != null)
                {
                    return false;
                }
    
                cmd.Dispose();
    
                OleDbCommand c = new OleDbCommand();
                c.Connection = con;
                c.CommandType = CommandType.Text;
                c.CommandText = SQL_ADDHOST;
                OleDbParameter[] param = {
                    new OleDbParameter("@HostDescription", OleDbType.VarWChar),
                    new OleDbParameter("@ViewUrl", OleDbType.VarWChar),
                    new OleDbParameter("@ManageCode", OleDbType.VarWChar),
                    new OleDbParameter("@Comment", OleDbType.LongVarWChar)
                };
                param[0].Value = hostInfo.Description;
                param[1].Value = hostInfo.Url;
                param[3].Value = hostInfo.Comment;
    
                // 计算密码哈希值
                byte[] InHashArray = UnicodeEncoding.Unicode.GetBytes(hostInfo.ManageCode);
                HMACSHA1 sha = new HMACSHA1();
                byte[] hash = sha.ComputeHash(InHashArray);
                string code = Convert.ToBase64String(hash);
    
                param[2].Value = code;
    
                foreach (OleDbParameter p in param)
                {
                    c.Parameters.Add(p);
                }
    
                int rows = c.ExecuteNonQuery();
                con.Close();
    
                return (1 == rows);
            }


    在此先谢谢大家了

    2009年7月15日 6:26

答案

  • 这个问题我自己已经解决了,其实是我在设计数据库时把字段的类型设置错了,因为我在 PowerDesigner 里面设计数据库的时候,字段的类型设置成了 CHAR

    create table WebHostInfo
    (
        HostId               GUID            not null,
        HostDescription      CHAR(255)       not null,
        ViewUri              CHAR(255)       not null,
        ManageCode           CHAR(128)       not null,
        Comment              MEMO,
    constraint PK_WEBHOSTINFO primary key (HostId)
    );
    而我使用 Office Access 2007 查看的时候,他将 CHAR 类型也显示为 文本,而实际上 Access 2007 设计器创建的文本,默认是 TEXT 类型(这也就是导致我混淆的原因),因此导致了这个问题。

    谢谢楼上的诸位回答
    2009年7月15日 6:56

全部回复

  • 类型改成备注应当可以避免这个问题
    【孟子E章】
    2009年7月15日 6:53
    版主
  • 你好,据我所知我以前用到的Access数据库文本字段的不会出现这样的问题的 不知道是不是你传入你的值本身含有空格?

    还有就是你描述的问题和代码怎么感觉不是很相关呢?
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月15日 6:53
    版主
  • 这个问题我自己已经解决了,其实是我在设计数据库时把字段的类型设置错了,因为我在 PowerDesigner 里面设计数据库的时候,字段的类型设置成了 CHAR

    create table WebHostInfo
    (
        HostId               GUID            not null,
        HostDescription      CHAR(255)       not null,
        ViewUri              CHAR(255)       not null,
        ManageCode           CHAR(128)       not null,
        Comment              MEMO,
    constraint PK_WEBHOSTINFO primary key (HostId)
    );
    而我使用 Office Access 2007 查看的时候,他将 CHAR 类型也显示为 文本,而实际上 Access 2007 设计器创建的文本,默认是 TEXT 类型(这也就是导致我混淆的原因),因此导致了这个问题。

    谢谢楼上的诸位回答
    2009年7月15日 6:56
  • 怪不得啊,我在asp.net2.0出来没有遇到过此类问题啊
    【孟子E章】
    2009年7月15日 6:58
    版主