ormonds Ответов: 1

Как мне правильно назначить тип данных для столбца в объекте DataTable?


У меня есть datatable, к которому я добавляю много столбцов с различными типами данных.
Когда после настройки datatable я проверяю тип данных столбцов, все они являются строковыми.
Мой код таков:
public partial class Form1 : Form
    {
        int i; 
        string SelectString;
        string MyConnection = "sssss;database=Workbench;UID=sa;password=xxxx";
        string ParentNumber;
        int dtcounter;
        int dt1counter;

        DataTable dt = new DataTable("MyJobTransactions");
        DataRow NewRow;
        DataRow row;
        DataColumn dc1 = new DataColumn();
        DataColumn dc2 = new DataColumn();
        DataColumn dc3 = new DataColumn();
        DataColumn dc4 = new DataColumn();
        DataColumn dc5 = new DataColumn();
        DataColumn dc6 = new DataColumn();
        DataColumn dc7 = new DataColumn();
        DataColumn dc8 = new DataColumn();
        DataColumn dc9 = new DataColumn();
        DataColumn dc10 = new DataColumn();
	etc etc....
        DataColumn dc108 = new DataColumn();
		
		private void Populate_Columns()
		{
		dc1.ColumnName = "JobTranID";
		dc1.Caption = "JobTranID";
		dc1.DataType = System.Type.GetType("System.Int32");
		dc2.ColumnName = "JobCode";
		dc2.Caption = "JobCode";
		dc2.DataType= System.Type.GetType("System.String");
		dc3.ColumnName = "ActivityCode";
		dc3.Caption = "ActivityCode";
		dc3.DataType = System.Type.GetType("System.String");
		dc4.ColumnName = "WorkCentreCode";
		dc4.Caption = "WorkCentreCode";
		dc4.DataType = System.Type.GetType("System.String");
		dc5.ColumnName = "TranDate";
		dc5.Caption = "Transaction Date";
		dc5.DataType= System.Type.GetType("System.DateTime");
		dc6.ColumnName = "YearNo";
		dc6.Caption = "Year No";
		dc6.DataType = System.Type.GetType("System.Int32");
		dc7.ColumnName = "PeriodNo";
		dc7.Caption = "Period No";
		dc7.DataType = System.Type.GetType("System.Int32");
		dc8.ColumnName = "TranType";
		dc8.Caption = "Transaction Type";
		dc8.DataType = System.Type.GetType("System.String");
		dc9.ColumnName = "SiteID";
		dc9.Caption = "Site ID";
		dc9.DataType = System.Type.GetType("System.Int32");
		dc10.ColumnName = "BatchNo";
		dc10.Caption = "Batch No";
		dc10.DataType = System.Type.GetType("System.Int32");
		....
		dc107.ColumnName ="JobManagerApprovedDate";
		dc107.Caption = "Job ManagerDate"
		;dc107.DataType = System.Type.GetType("System.DateTime");
		}
		public Form1()
		{
		     InitializeComponent();
		}
		     private void Form1_Load(object sender, EventArgs e)
		     {
		     Populate_Columns();
		     dtcounter = 1;
		     string dcnumber;
		     while (dtcounter < 108)
		     {
		         dcnumber = "dc" + dtcounter.ToString();
		         dt.Columns.Add(dcnumber);
		         dtcounter += 1;
		     }
		     MessageBox.Show(dt.Columns[0].DataType.ToString(),"",MessageBoxButtons.OK);
            		
					.......
		}


Последнее сообщение говорит мне, что dt.Columns[0] имеет тип string, а не Int32.

Как правильно назначить тип данных?

Что я уже пробовал:

Я перепробовал все альтернативы, включая typeof().
Я попытался перечислить тип всех dt.Столбцы - это все строки.

1 Ответов

Рейтинг:
4

OriginalGriff

Похоже, вы пытаетесь сгенерировать имя переменной, а затем использовать содержимое этой переменной для добавления столбца в базу данных:

while (dtcounter < 108)
{
    dcnumber = "dc" + dtcounter.ToString();
    dt.Columns.Add(dcnumber);
    dtcounter += 1;
}
Это не сработает: вы не можете получить доступ к переменным через строку (без использования отражения, и это становится довольно волосатым для такого новичка, как вы).

Таким образом, то, что вы добавляете в dataTable в виде столбца, - это строка "dc1", "dc2" и т. д., а не столбец, который вы пытаетесь добавить.
Если вам нужно добавить такие столбцы (а я не рекомендую этого делать), создайте массив DataColumns:
private DataColumn[] columns = new DataColumn[108];
И добавьте новый экземпляр объекта DataColumn к каждому из них:
private void Populate_Columns()
    {
    DataColumn dc = new DataColumn();
    dc.ColumnName = "JobTranID";
    dc.Caption = "JobTranID";
    dc.DataType = System.Type.GetType("System.Int32");
    columns[0] = dc;
    DataColumn dc = new DataColumn();
    dc.ColumnName = "JobCode";
    dc.Caption = "JobCode";
    dc.DataType= System.Type.GetType("System.String");
    columns[1] = dc;
    dc = new DataColumn();
    dc.ColumnName = "ActivityCode";
    ...
Затем вы можете получить к ним доступ через свой индекс.

Но, честно говоря, это довольно плохой способ сделать все это. Я бы использовал конфигурационный файл и загружал DataTable непосредственно из него: CSV, XML, JSON - любой из них подойдет.


ormonds

Спасибо.

OriginalGriff

Всегда пожалуйста!