programing

DataReader 개체에서 필드의 데이터 유형 찾기

newsource 2023. 7. 9. 11:12

DataReader 개체에서 필드의 데이터 유형 찾기

다음과 같은 질문이 있습니다.

SqlCommand cmd = new SqlCommand("Select employee_id, 
          lastname, firstname from Employees", conn);

// Execute reader
SqlDataReader reader = cmd.ExecuteReader();

필드의 데이터 유형을 알고 싶다고 가정합니다.employee_id다음을 사용하여 이 문제를 결정하는 방법SqlDataReader?

reader.GetFieldType(int ordinal)

필드의 .NET 유형을 반환하는 동안:

reader.GetDataTypeName(int ordinal)

데이터 원본에 있는 필드의 데이터 형식을 나타내는 문자열을 반환합니다(예:varchar).GetFieldType당신이 설명한 사용 사례를 고려할 때 당신에게 더 유용할 것 같습니다.

다음을 통해 모든 관련 메타데이터를 얻을 수 있습니다.

var metaDataList = new List<IDictionary<String, Object>>();

using (SqlDataReader reader = cmd.ExecuteReader())
{
    var hasRows = reader.HasRows;
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            dynamic fieldMetaData = new ExpandoObject();
            var columnName = reader.GetName(i);
            var value = reader[i];
            var dotNetType = reader.GetFieldType(i);
            var sqlType = reader.GetDataTypeName(i);
            var specificType = reader.GetProviderSpecificFieldType(i);
            fieldMetaData.columnName = columnName;
            fieldMetaData.value = value;
            fieldMetaData.dotNetType = dotNetType;
            fieldMetaData.sqlType = sqlType;
            fieldMetaData.specificType = specificType;
            metaDataList.Add(fieldMetaData);
        }
    }
}

약간 과잉 살상이지만, 그 이상의 유형 정보가 필요할 것이라고는 상상할 수 없습니다.if 문 또는 예외 처리에 hasRows 변수를 사용할 수도 있습니다.

사용하다.GetFieldType(colnameIndex)다음과 같이:

If (reader.GetFieldType(0) Is GetType(String) Or reader.GetFieldType(0) Is
GetType(Date) )
{
...

}

또는 다음과 같을 수 있습니다.reader.GetFieldType(0)

추가 논리에 따라 이 함수를 간단한 텍스트 또는 조건부 형식으로 성형할 수 있습니다.

.GetDataTypeName 당신이 추구하는 것일 수도 있습니다.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getdatatypename.aspx

검색할 유형의 열의 서수를 전달하는 방법을 사용할 수 있습니다.시스템을 반환합니다.필드 유형입니다.

예를 들어, 첫 번째 열의 유형을 가져오려면 다음을 수행할 수 있습니다.var firstColType = reader.GetFieldType(0);

이것이 오래된 게시물이라는 것은 인정하지만, 저는 그냥 우연히 발견했습니다.이것이 바로 제 접근 방식입니다. 열을 #로 참조하지 않고 DataReaders에서 강력한 타이핑을 사용할 수 있기 때문입니다(열이 순서를 변경할 때 강력하게 타이핑되지 않는 것과 마찬가지입니다).

다음과 같은 방법을 사용해 보십시오.

    using (dsSomeDataSet dsList = new dsSomeDataSet())
{
    using (System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand())
        {

        //blah blah blah take care of parameter definitions for the stored proc

        using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())
            {
                while (sqlReader.Read())
                {
                    //populate each returning row
                    dsSomeDataSet.tATablesRow rowNote = dsList.tATable.tATablesRow();

                //using the actual field name, strongly typed, required using the declared dataset variable, not the dataset object             
                    rowNote.ThisField'sName = new Guid(sqlReader[ dsList.tATable.ThisField'sName.ColumnName].ToString() );

                dsList.tNotes.AddtNotesRow( rowNote );
                }
                sqlReader.Close();
            }


        }   //releases the command resources
    }   //releases the dataset resources

언급URL : https://stackoverflow.com/questions/17920146/find-the-datatype-of-field-from-datareader-object