Oracle USER_TAB_COLS表DATA_DEFAULT字段查询返回空值问题
解决USER_TAB_COLS.DATA_DEFAULT返回空字符串的问题
核心问题分析
你的代码里有两个关键问题导致始终得到空字符串:
- 未正确处理数据库NULL值:当DATA_DEFAULT为NULL时,
row["DATA_DEFAULT"].ToString()会直接返回空字符串,无法区分“实际为空字符串”和“数据库NULL”。 - 参数传递错误:最后实例化
Colum对象时,你传入的是硬编码的"",而不是前面获取的defaultvalue变量,这直接导致最终存储的默认值永远是空。
修正后的代码
string query = $"SELECT COLUMN_NAME,DATA_DEFAULT,DATA_TYPE,DATA_PRECISION,DATA_LENGTH,NULLABLE FROM USER_TAB_COLS WHERE TABLE_NAME = '{tableName}'"; OracleDataAdapter adapter = new OracleDataAdapter(query, connection); DataSet dataSet = new DataSet(); adapter.Fill(dataSet); if (dataSet.Tables.Count > 0) { DataTable columnsTable = dataSet.Tables[0]; foreach (DataRow row in columnsTable.Rows) { string columnName = row["COLUMN_NAME"].ToString(); string dataType = row["DATA_TYPE"].ToString(); int dataLength = 0; if (!row.IsNull("DATA_PRECISION") && Convert.ToInt32(row["DATA_PRECISION"]) == 1) { dataLength = 1; } else { dataLength = !row.IsNull("DATA_LENGTH") ? Convert.ToInt32(row["DATA_LENGTH"]) : 0; } bool nullable = row["NULLABLE"].ToString() == "Y"; // 正确处理DBNull,区分NULL和空字符串 string defaultvalue = row.IsNull("DATA_DEFAULT") ? null : row["DATA_DEFAULT"].ToString().Trim(); // 传递获取到的defaultvalue,而非硬编码的空字符串 Colums.Add(new Colum(columnName, dataType, dataLength, nullable, defaultvalue)); } }
额外优化建议
- 使用
row.IsNull(columnName)判断数据库NULL值,比ToString() != ""更可靠,避免类型转换异常。 - Oracle的
DATA_DEFAULT存储字符串类型默认值时会带有单引号(比如默认值为test时,存储的是'test'),如果需要去掉外层单引号,可以在获取后处理:if (defaultvalue != null && defaultvalue.StartsWith("'") && defaultvalue.EndsWith("'")) { defaultvalue = defaultvalue.Substring(1, defaultvalue.Length - 2); } - 建议使用参数化查询替代字符串拼接,避免SQL注入风险:
string query = "SELECT COLUMN_NAME,DATA_DEFAULT,DATA_TYPE,DATA_PRECISION,DATA_LENGTH,NULLABLE FROM USER_TAB_COLS WHERE TABLE_NAME = :tableName"; OracleDataAdapter adapter = new OracleDataAdapter(query, connection); adapter.SelectCommand.Parameters.Add(":tableName", OracleDbType.Varchar2).Value = tableName;
内容的提问来源于stack exchange,提问作者phpain
相关产品推荐
相关产品推荐

