很久以前,我正在使用 C#。我正在制作一個程式,它將接收 3 個 sql 資料庫表并將它們保存在一個串列中。
我遵循了有關如何處理此問題的指南,但我不確定它有什么問題。當我列印出來時,我得到了資料的輸出,但是 0 進入了我的串列。
請幫助我,并在此先感謝:)
代碼:
List<Product> products = null;
string connetionString;
SqlConnection cnn;
connetionString = @"";
cnn = new SqlConnection(connetionString);
cnn.Open();
if (cnn != null)
{
Console.WriteLine("Connection Open!");
}
SqlCommand command = new SqlCommand("SELECT data1.zip_code ZipCode, data1.order_date as OrderDate, data1.order_number as OrderNumber, data1.first_name as firstName, data1.last_name as lastName, data2.order_number as OrderNumb2Two, data2.sku_id as SkuID, data2.quantity as Quantity, data2.price as Price, data3.article_name as articleName, data3.[weight] as Weight FROM data1,data2,data3", cnn);
var dataReader = command.ExecuteReader();
/*
while (dataReader.Read())
{
Console.WriteLine(dataReader["ZipCode"].ToString());
Console.WriteLine(dataReader["OrderDate"].ToString());
Console.WriteLine(dataReader["OrderNumber"].ToString());
Console.WriteLine(dataReader["firstName"].ToString());
Console.WriteLine(dataReader["lastName"].ToString());
Console.WriteLine(dataReader["SkuID"].ToString());
Console.WriteLine(dataReader["Quantity"].ToString());
Console.WriteLine(dataReader["Price"].ToString());
Console.WriteLine(dataReader["articleName"].ToString());
Console.WriteLine(dataReader["Weight"].ToString());
}*/
products = GetList<Product>(dataReader);
if(products != null)
{
Console.WriteLine(products);
}
else
{
Console.WriteLine(products);
}
foreach(object o in products)
{
Console.WriteLine(o);
}
cnn.Close();
}
public class Product
{
public int SkuID { get; set; }
public Int32 Quantity { get; set; }
public Int32 Weight { get; set; }
public Int32 Price { get; set; }
public Int64 OrderNumber { get; set; }
public Int64 OrderNumb2Two { get; set; }
public string articleName { get; set; }
public DateTime OrderDate { get; set; }
public int ZipCode { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
}
public static List<T> GetList<T>(IDataReader reader)
{
List<T> list = new List<T>();
while (reader.Read())
{
var type = typeof(T);
T obj = (T)Activator.CreateInstance(type);
foreach (var prop in type.GetProperties())
{
var propType = prop.PropertyType;
prop.SetValue(obj, Convert.ChangeType(reader[prop.Name].ToString(), propType));
//Console.WriteLine(Convert.ChangeType(reader[prop.Name].ToString(), propType));
}
list.Add(obj);
}
return list;
uj5u.com熱心網友回復:
除其他問題外,如評論中所述,Convert.ChangeType在這種特定情況下不適合使用。ChangeType實際上根本不改變值,它只回傳與請求型別等效的物件,如果原始物件已經是等效型別。
閱讀更多關于.NET 中的型別轉換
在這種情況下,您應該會遇到此錯誤:
Run-time exception (line 103): Input string was not in a correct format.
Stack Trace:
[System.FormatException: Input string was not in a correct format.]
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType)
at Program.GetList[T](IDataReader reader) :line 103
at Program.Main() :line 45
這里的關鍵是您故意將值轉換為string,并且string型別不等同于和 之類的值int型別DateTime。
如果要使用,ChangeType則需要DbType使用以下方法保留GetValue:
prop.SetValue(obj, Convert.ChangeType(reader.GetValue(reader.GetOrdinal(prop. Name)), propType));
或者我們可以將其分解為更明顯:
int columnIndex = reader.GetOrdinal(prop. Name);
object columnValue = reader.GetValue(columnIndex);
prop.SetValue(obj, Convert.ChangeType(columnValue, propType));
注意:如果您確保資料庫中的型別與您嘗試設定的物件的相應屬性中的型別等效,這仍然有效。
我們通常會使用基于字符的型別而不是整數型別將郵政編碼或郵政編碼存盤在資料庫中,因為這將保留前導零,并且許多司法管轄區的某些郵政編碼使用非數字字符......但這是另一個討論,關鍵是,如果型別不正確,仍然會失敗。
Convert.ChangeType()
Convert.ChangeType()這個小提琴顯示了一個仍然會失敗的簡單示例: https ://dotnetfiddle.net/j0ArmN
這樣做也是如此,甚至Int16不等于Int32:https ://dotnetfiddle.net/Rm2XqO
Run-time exception (line 114): cannot use ChangeType to convert 'Quantity': System.Int16 => System.Int32 (Value=12)
事實上,價格的整數列也是不尋常的,價格通常存盤為十進制,如下所示:https ://dotnetfiddle.net/yaxLpk十進制(顯然)不能在不丟失資訊的情況下更改或轉換為整數:
Run-time exception (line 114): cannot use ChangeType to convert 'Price': System.Decimal => System.Int32 (Value=14.0000)
這是一個顯示邏輯可以作業的作業小提琴:https ://dotnetfiddle.net/xYBLr3
當然有許多更好的方法可以實作相同的簡單結果,考慮TableAdapters或Linq to SQL或像物體框架這樣的功能齊全的 ORM,而不是嘗試從第一原則開始做所有事情。
這是使用序列化技術將資料讀入預期型別的??最小 EF6 實作:https ://dotnetfiddle.net/TVxGfw
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505430.html
上一篇:顫振拆分串列并使用單個值進行計算
