2009-10-25 3 views
0

Здесь http://www.c-sharpcorner.com/UploadFile/rupadhyaya/TypedDataSets12032005021013AM/TypedDataSets.aspx он говорит: «мы можем указать тип данных при создании DataColumn для DataTable. Это необходимо для обеспечения безопасности во время выполнения для столбца, чтобы в столбце можно было сохранить только данные указанного типа данных Таким же образом, в большинстве случаев мы предпочитаем делать сам DataSet как безопасный для типа, чтобы защитить его от несоответствия времени выполнения. Следовательно, Typed DataSets генерируют классы, которые предоставляют каждый объект в DataSet безопасным образом. Эти классы наследуются непосредственно из класса DataSet. "TypedDataSet: Почему .NET Framework принимает строку в столбце int datatable?

Но это работает, в то время как оно не должно храниться id.ToString(), а не id в столбце typeof (int) id?

using System; 
using System.Data; 

public class MyClass { 

    public static void Main() { 

     DataTable custTable = new DataTable("Customers"); 
     // add columns 
     custTable.Columns.Add("id", typeof(int)); 
     custTable.Columns.Add("name", typeof(string)); 
     custTable.Columns.Add("address", typeof(string)); 

     // set PrimaryKey 
     custTable.Columns[ "id" ].Unique = true; 
     custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] }; 

     // add ten rows 
     for(int id=1; id<=10; id++) 
     { 
      custTable.Rows.Add(
       new object[] { id.ToString(), string.Format(
       "customer{0}", id.ToString()), string.Format("address{0}", id.ToString()) }); 
     } 

     custTable.AcceptChanges(); 

     foreach (DataRow row in custTable.Rows) { 
      Console.WriteLine("{0} {1}",row["id"],row["name"]); 
     } 
     Console.ReadLine(); 
    } 
} 
+0

Это одно из больших преимуществ при использовании LINQ (особенно Linq-to-SQL): компилятор может выполнять проверку типов, кроме этого здесь ..... –

+0

Я не могу использовать LINQ-to -SQL, поскольку я использую Oracle и .NET 2. – programmernovice

ответ

1

Вы должны прочитать остальную часть статьи, к которой вы привязались, а не только первое предложение. Код, который вы отправили, создает нетто-файл DataSet. A typed DataSet создается с помощью DataSet Designer и фактически обеспечивает защиту типа во время компиляции. В типизированном DataSet у вас должен быть класс CustomersRow, который обнаруживает свойство int id и строки name и address, и вы получите ошибку времени компиляции, если попытаетесь установить id на строковое значение.

Как это бывает, классы ADO преобразуют значения в соответствующие типы данных во время выполнения, если могут. Поэтому, даже если ваш код устанавливает id в строку, данные, фактически сохраненные в DataRow, являются попыткой установить id на «a», и вы получите ошибку во время выполнения. Это тоже работает наоборот; если вы установите customer на целое число 11, вы обнаружите, что на самом деле оно содержит строку «11».

+0

Привет, спасибо, я протестировал с помощью «a», он генерирует ошибку, вот что я хотел, мне просто нужно во время выполнения, мне все равно во время разработки. – programmernovice

3

Ваш пример не является областью ответственности компилятора. вы создаете массив объектов, поэтому ничего неправильного здесь

Возможно, вы спрашиваете, почему это строковое значение принято как значение int по базе данных ?. Может быть, ваша библиотека распознала id.ToString как правильное целое число, или может быть, это было сделано с помощью механизма базы данных. Поскольку на уровне SQL все преобразовывается только в текст

+0

OK Я переформулирую, а не компилятор C#, но тогда ответственность ADO.NET? – programmernovice

+0

определенно ASP.NET делает это автоматически. –

1

Поскольку компилятор не имеет понятия о том, что класс DataTable должен и не должен принимать.

Метод добавления коллекции строк содержит кучу ссылок на объекты, поэтому он действителен для отправки любых типов данных, которые вы хотите в него. Он пытается преобразовать данные во время выполнения, и если вы отправляете некоторые данные, которые не могут быть преобразованы, вы получаете ошибку времени выполнения.

0

Класс DataTable похож на таблицу поиска имени столбца строки & значение объекта, передаваемый вами параметр типа не используется компилятором.

Смежные вопросы