call
DataAdapter.FillSchema(YourDataSet);then access DataColumn's MaxLength and AllowDBNull propertyYourDataSet.Tables[0].Columns["BH"].AllowDBNull

解决方案 »

  1.   

    不知你试过没?我都试过了,不是需要的结果。
    maxlength读出的是-1,alldbnull读出的全部是true在java中是有一个专门的对象读这些值ResultSetMetaData不知到.net中有没有类似的
      

  2.   

    string sConn = "server=localhost;database=pubs;uid=sa;pwd=;";
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter("select * from authors", sConn);
    da.FillSchema(ds, SchemaType.Source);
    foreach (DataColumn c in ds.Tables[0].Columns)
    Console.WriteLine("{0}: \ttype:{1},\tsize:{2},\tAllDBNull? {3}", c.ColumnName, c.DataType.Name, c.MaxLength, c.AllowDBNull);
    output:
    au_id:          type:String,    size:11,        AllDBNull? False
    au_lname:       type:String,    size:40,        AllDBNull? False
    au_fname:       type:String,    size:20,        AllDBNull? False
    phone:          type:String,    size:12,        AllDBNull? False
    address:        type:String,    size:40,        AllDBNull? True
    city:           type:String,    size:20,        AllDBNull? True
    state:          type:String,    size:2,         AllDBNull? True
    zip:            type:String,    size:5,         AllDBNull? True
    contract:       type:Boolean,   size:-1,        AllDBNull? False
      

  3.   

    thanks a lot.you are just a real mvpbut it still have some problemit can not make out the real type name in database.i use the DataReader.GetDataTypeName(i) can get the real name(such as varchar).In the other way,if the field type is numeric,the maxlength return -1(That's not my expect)
      

  4.   

    SqlConnection cn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    DataTable schemaTable; 
    SqlDataReader myReader; 
     
    cn.ConnectionString = @"Data Source=(local);User ID=sa;Password=;Initial Catalog=Northwind";
    cn.Open();cmd.Connection = cn;
    cmd.CommandText = "SELECT * FROM Employees";
    myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);schemaTable = myReader.GetSchemaTable();foreach (DataRow myField in schemaTable.Rows)
    {
        Console.WriteLine("{0}; {1}, {2}", myField["COLUMNNAME"], myReader.GetDataTypeName( myReader.GetOrdinal(myField["COLUMNNAME"].ToString())),
    myField["COLUMNSIZE"]);
    }myReader.Close();
    cn.Close();output:
    EmployeeID; int, 4
    LastName; nvarchar, 20
    FirstName; nvarchar, 10
    Title; nvarchar, 30
    TitleOfCourtesy; nvarchar, 25
    BirthDate; datetime, 8
    HireDate; datetime, 8
    Address; nvarchar, 60
    City; nvarchar, 15
    Region; nvarchar, 15
    PostalCode; nvarchar, 10
    Country; nvarchar, 15
    HomePhone; nvarchar, 24
    Extension; nvarchar, 4
    Photo; image, 2147483647
    Notes; ntext, 1073741823
    ReportsTo; int, 4
    PhotoPath; nvarchar, 255
      

  5.   

    THANKS A LOT
    By the way ,can it work out the value "ISNULL" in this way
      

  6.   

    I have tried itbut still a little problem,if the type is numeric,it can't get the length(all the numerictype fields return the same columnsize 17)There are my expect resultXXRefId  varchar 32 0  
    LSYG  text 2147483647 1  
    ZYDZ  varchar 60 1  
    DZXX  varchar 30 0  
    CZDH  varchar 30 0  
    LXDH  varchar 30 0  
    YZBM  char 6 0  
    XXZGBM  varchar 60 0  
    ZZJGDM  varchar 9 1  
    XQR  varchar 60 1  
    JXNY  varchar 6 0  
    DZZFZR  varchar 30 0  
    XXDZ  varchar 60 0  
    XXYWMC  varchar 180 1  
    XXMC  varchar 60 0  
    XXDM  varchar 12 0  
    XXQHM  char 6 1  
    XXBBM  char 1 1  
    XXLBM  char 2 1  
    SZDLBM  char 1 0  
    SZDJJSXM  char 1 1  
    SZDMZSX  char 1 1  
    GZGDXZ  numeric 3 0  
    CZRXNL  numeric 4 0  
    CZGDXZ  numeric 3 0  
    XXRXNL  numeric 3 0  
    XXGDXZ  numeric 5 0  
    ZSQY  char 30 1  
    FJXYYM  char 3 1  
    ZJXYYM  char 3 0  
    XXXZ  varchar 60 1  
    BUT the real result isXXRefId    varchar      32         False
    LSYG    text      2147483647         True
    ZYDZ    varchar      60         True
    DZXX    varchar      30         False
    CZDH    varchar      30         False
    LXDH    varchar      30         False
    YZBM    char      6         False
    XXZGBM    varchar      60         False
    ZZJGDM    varchar      9         True
    XQR    varchar      60         True
    JXNY    varchar      6         False
    DZZFZR    varchar      30         False
    XXDZ    varchar      60         False
    XXYWMC    varchar      180         True
    XXMC    varchar      60         False
    XXDM    varchar      12         False
    XXQHM    char      6         True
    XXBBM    char      1         True
    XXLBM    char      2         True
    SZDLBM    char      1         False
    SZDJJSXM    char      1         True
    SZDMZSX    char      1         True
    GZGDXZ    decimal      17         False
    CZRXNL    decimal      17         False
    CZGDXZ    decimal      17         False
    XXRXNL    decimal      17         False
    XXGDXZ    decimal      17         False
    ZSQY    char      30         True
    FJXYYM    char      3         True
    ZJXYYM    char      3         False
    XXXZ    varchar      60         True
      

  7.   

    I still have found a strange phenomenon.I use both java and .net read the fieldsizeIf i set the field type to numeric in sqlserve,i can get the right fieldsize in java,but get the maxlength in .net(the length is always 17).If i set the field type to int in sqlserve,i can get the right fieldsize in .net,but get the maxlenght in java(the length is always 11).
      

  8.   

    what you are looking for is probably called "NumericPrecision", check outforeach (DataRow myField in schemaTable.Rows)
    {
      foreach (DataColumn dc in schemaTable.Columns)
    Console.WriteLine(dc.ColumnName + ":" + myField[dc]);
    }
      

  9.   

    NumericPrecision
     
    GZGDXZ    decimal      1   the right value must be:   3      
    CZRXNL    decimal      2   the right value must be:   4   
    CZGDXZ    decimal      1   the right value must be:   3    
    XXRXNL    decimal      1   the right value must be:   3    
    XXGDXZ    decimal      3   the right value must be:   5
      

  10.   

    i dont wann't get the NumericPrecision.i just wanna get the field size.
    but 
    use myField["COLUMNSIZE"]
    it always be 17
      

  11.   

    JUST FOR EXAMPLEIn SQLSERVEColumnName   DataType   Length     NumericPrecision    NumericScale GZGDXZ           numeric         5            1                          0
    CZRXNL           numeric         5            2                          0
    CZGDXZ           numeric         5           1                          0
    XXRXNL           numeric         5            1                          0
    XXGDXZ           numeric         5            3                          1
    XZ                   numeric         9            10                        0
    Reading by .net
    ColumnName   DataType   LengthGZGDXZ          decimal         17
    CZRXNL          decimal         17
    CZGDXZ          decimal         17
    XXRXNL           decima          17
    XXGDXZ          decimal          17
    XZ                   decimal         17
    Reading by javaColumnName   DataType   LengthGZGDXZ           numeric       3
    CZRXNL            numeric       4
    CZGDXZ            numeric      3
    XXRXNL             numeric      3
    XXGDXZ            numeric       5
    XZ                    numeric      12