我想做这样的事情:
myYear = record.GetValueOrNull<int?>("myYear"),
Run Code Online (Sandbox Code Playgroud)
请注意可空类型作为通用参数.
由于该GetValueOrNull函数可以返回null,我的第一次尝试是这样的:
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : class
{
object columnValue = reader[columnName];
if (!(columnValue is DBNull))
{
return (T)columnValue;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但我现在得到的错误是:
类型'int?' 必须是引用类型才能在泛型类型或方法中将其用作参数"T"
对!Nullable<int>是一个struct!所以我尝试将类约束更改为struct约束(并且副作用不能再返回null):
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : struct
Run Code Online (Sandbox Code Playgroud)
现在任务:
myYear = record.GetValueOrNull<int?>("myYear");
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
类型'int?' 必须是非可空值类型才能在泛型类型或方法中将其用作参数"T"
是否可以将可空类型指定为通用参数?
所以我有这门课:
public class Foo<T> where T : ???
{
private T item;
public bool IsNull()
{
return item == null;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种类型约束,允许我将所有内容都用作类型参数null.这意味着所有引用类型以及所有Nullable(T?)类型:
Foo<String> ... = ...
Foo<int?> ... = ...
Run Code Online (Sandbox Code Playgroud)
应该是可能的.
使用class类型约束只允许我使用引用类型.
附加信息:
我正在编写管道和过滤器应用程序,并希望使用null引用作为传递到管道的最后一项,以便每个过滤器可以很好地关闭,进行清理等...
我正在尝试运行以下代码,但得到一个转换错误.如何重写我的代码以实现相同的目标?
boolResult= (bool?)dataReader["BOOL_FLAG"] ?? true;
intResult= (int?)dataReader["INT_VALUE"] ?? 0;
Run Code Online (Sandbox Code Playgroud)
谢谢
我目前正在开发一个将导出MySQL数据的C#项目.导出是服务器中的任何数据库,所以我不会知道表中的字段和数据类型,我不知道表中的字段是否允许空值.
在测试期间,我发现导出工作正常,但如果字段允许null,当mysql数据读取器到达行为null时,它会显示错误SqlNullValueException,data为null.
我已经尝试过,if (reader.getString(field) == null) {}但它仍然显示错误.
如何处理数据库中的Null值.
感谢您的任何帮助,您可以提供.
说我有这个班:
class myclass
{
public int Field1{ get; set; }
public int? Field2 { get; set; } //Note Field2 is nullable
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用来自数据库的数据填充通用列表.由于GetSqlInt32实现了INullable,我认为下面的代码可以工作.它没有.如果Field2为null,则会生成错误.
List<myclass> mylist=new List<myclass>();
int Field1_Ordinal = rdr.GetOrdinal("Field1");
int Field2_Ordinal = rdr.GetOrdinal("Field2");
SqlDataReader rdr = cmd.ExecuteReader(); //Execute a stored procedure to retrieve data from the database
while (rdr.Read())
{
mylist.Add(new myclass
{
Field1 = rdr.GetSqlInt32(Field1_Ordinal).Value,
Field2 = rdr.GetSqlInt32(Field2_Ordinal).Value //Error if field2 is null
});
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么它不起作用?
只是在寻找一个解释 - 问题几乎解释了所有,但这里有点额外:
//this line works OK
int i = Convert.ToInt32(dt.Rows[x]["SmallintColumnName"]);
//this line errors out
int j = (int)dt.Rows[x]["SmallintColumnName"];
Run Code Online (Sandbox Code Playgroud)
我发现这很奇怪,但我想有一个有效的论据,说明为什么会这样.
谢谢.
编辑:您好@Damien_The_Unbeliever - 它是一个InvalidCastException - 指定的强制转换是无效的.我想我需要阅读拳击和拆箱.我认为两者都有效.现在我刚试过:
int k = (Int32)r_dtAttribute.Rows[x]["CultureId"];
Run Code Online (Sandbox Code Playgroud)
这也失败了同样的InvalidCastException - 所以任何人都可以告诉我它们之间的实际差异
//fails
int k = (Int32)r_dtAttribute.Rows[x]["CultureId"];
Run Code Online (Sandbox Code Playgroud)
和
//works
int i = Convert.ToInt32(dt.Rows[x]["SmallintColumnName"]);
Run Code Online (Sandbox Code Playgroud)
Convert.ToInt32函数做什么只是用(Int32)进行转换不行?
谢谢
我正在尝试在 C# 应用程序中使用 ExecuteReader 从表中检索所有列。Db 是 postgre。为了测试,我按照教程创建了一个控制台应用程序,该教程确实展示了如何使用函数进行查询,但不使用传递参数。控制台应用程序函数用于测试
static void Main(string[] args)
{
// Connect to a PostgreSQL database
NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;User Id=postgres; " +
"Password=pes;Database=pmc;");
conn.Open();
// Define a query
NpgsqlCommand command = new NpgsqlCommand("SELECT * from audit.exception_gl_accounts()", conn);
// Execute the query and obtain a result set
NpgsqlDataReader dr = command.ExecuteReader();
// Output rows
while (dr.Read())
Console.Write("{0}\t{1} \n", dr[0], dr[1]);
conn.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
在 NpgsqlCommand 中,我将不带参数的查询发送到函数audit.exception_gl_accounts,它运行良好。现在我如何将参数传递给这样的函数
“从 sms.get_accounts_info(@AccountNumber) 选择*;
我正在尝试使用此函数检索所有 5 列并获取这些对象
public static string GetAccountInfo(string accountNumber) …Run Code Online (Sandbox Code Playgroud) 我正在使用SQLDataReader将列数据插入到字符串[]中.
但是,某些列值为null.我有点不确定如何检查这个,因为当我做reader [column_pos]时它表示值为"n/a".
我可以执行哪些检查,以便我可以执行以下操作:
for(int i=0; i<myarray.Length;i++){
if(something){
myarray[i] = reader[i];
}
else
{
myarray[i] = "";
}
}
Run Code Online (Sandbox Code Playgroud)
并在列中有空值时插入空白符号.
我发现自己从各种SQL对象(DataTable,SqlReader)中读取数据并分配给我自己的自定义对象.通常,我无法确定从数据库检索的数据是否为空或包含有效数据.虽然我使我的对象属性可以为空但我仍然无法将对象值分配给整数属性.
public int? ClientId{ get; set; }
this.ClientId = clientTable.Rows[0]["ID"];
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我不能将clientTable.Rows[0]["ID"]as转换为as,int因为值可能是null.
this.ClientId = (int)clientTable.Rows[0]["ID"]; // WARNING! value could be null
Run Code Online (Sandbox Code Playgroud)
所以我认为扩展方法是个好主意(我从这个SO答案得到了这个想法)....
public static int GetIntFromDB(this DataRow row, string columnName)
{
return row[columnName] as int? ?? default(int);
}
Run Code Online (Sandbox Code Playgroud)
使用...调用扩展方法
this.ClientId = clientTable.Rows[0].GetIntFromDB("ID");
Run Code Online (Sandbox Code Playgroud)
问题是Extension方法总是返回一个整数.有没有办法将NULL值返回给对象属性?
我经常收到错误:
附加信息:数据为空.无法在Null值上调用此方法或属性.
当我尝试接收信息时.如何检查datareader是否为空.
例如,这是我的代码:
while (rd.Read())
{
if (rd.HasRows)
{
foundInformation[0] = rd.GetString(0);
foundInformation[1] = rd.GetString(1);
}
else
{
foundInformation[0] = "nvt";
foundInformation[1] = "nvt";
}
}
Run Code Online (Sandbox Code Playgroud)
如何检查rd.GetString(0)是否为空?
谢谢.
我的代码中的最后一个字符串有问题.
这是我的代码:
private void comboLname_SelectedIndexChanged(object sender, EventArgs e)
{
string conn = "Data Source=srv-db-02;Initial Catalog=rmsmasterdbtest;Persist Security Info=True;User ID=test;Password=*****";
string Query = "select * from RMSCRMTest.dbo.sales where LastName= '" + comboLname.Text + "' ;";
SqlConnection Myconn = new SqlConnection(conn);
SqlCommand cmdDataBase = new SqlCommand(Query, Myconn);
SqlDataReader Reader;
try
{
Myconn.Open();
Reader = cmdDataBase.ExecuteReader();
while (Reader.Read())
{
string ID = Reader.GetInt32(Reader.GetOrdinal("ID")).ToString();
string AccountNuber = Reader.GetString(Reader.GetOrdinal("AccountNumber")).ToString();
string Time = Reader.GetDateTime(Reader.GetOrdinal("Time")).ToString();
string Deposit = Reader.GetDecimal(Reader.GetOrdinal("Deposit")).ToString();
string slastname = Reader.GetString(Reader.GetOrdinal("lastname"));
string sstatus = Reader.GetString(Reader.GetOrdinal("status"));
txtid.Text …Run Code Online (Sandbox Code Playgroud) c# ×11
datareader ×2
generics ×2
.net ×1
ado.net ×1
casting ×1
dbnull ×1
mysql ×1
npgsql ×1
null ×1
nullable ×1
postgresql ×1
sql ×1
sql-server ×1
sqlclient ×1