从OleDbDataReader中的MS ACCESS读取具有特殊名称的属性

时间:2012-05-28 23:52:59

标签: c# ms-access oledbdatareader

如果字段名称为“ - ”,“%”,“/”或字段名称为“级别”,则从accdb数据库读取时会出现问题。 当我有这样的事情时:

string mySelectQuery = "SELECT 'Part_Time_%','Level',Level_change_reason FROM Employees";
OleDbConnection myConnection = new OleDbConnection(oledbConnectString);
OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection);
myConnection.Open();
OleDbDataReader myReader = myCommand.ExecuteReader();

它运作良好,因为''字符取消了特殊字符和单词修饰。 这没关系:

if ((myReader["Name"] == DBNull.Value) ....
if ((myReader["Surname"] == DBNull.Value) ....

但是当我尝试这个时:

if ((myReader["Macro-activity"] == DBNull.Value) ...
if ((myReader["Level"] == DBNull.Value)....

它跳到了捕捉声明。 我也试过myReader["\u004cevel"], myReader["'Macro-activity'"] - 它完全忽略转义字符。

每个答案都会非常感激。

P.S。:我无法更改属性的名称。

2 个答案:

答案 0 :(得分:1)

在Access中转义列名称时使用大括号[ & ],而不是单引号。

string mySelectQuery = "SELECT '[Part_Time_%],[Level],Level_change_reason FROM Employees";

单引号用于字符串,因此在select语句中使用“Level”将返回文本“Level”作为结果集中的未命名列。如果您尝试myReader.GetItem(1),则每行都会返回"Level"

答案 1 :(得分:0)

我找到了这个,它做了我想要的:

if ((myReader.GetValue(18) == DBNull.Value) || string.Compare(myReader.GetValue(18).ToString(), "0") == 0)....