2013-04-02 90 views
1

我用下面的代碼來創建一個dbf文件並填充它,一切工作正常。問題是文件的名稱被截斷爲最多8個字符。任何想法爲什麼或如何保持全名?DBF文件名截斷

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+path+";Extended Properties=dBase IV"; 
OleDbConnection connection = new OleDbConnection(connectionString); 
     connection.Open(); 
cmd.CommandText = @"CREATE TABLE calendfull(
           date1 datetime , 
           day1 int , 
           month1 int , 
           year1 int , 
           dow int , 
           endmonth int 
           )"; 

      cmd.ExecuteNonQuery(); 

    foreach (DataRow row in calend.Rows) 
      { 
       day = Convert.ToInt32(row["day"]); 
       year = Convert.ToInt32(row["year"]); 
       month = Convert.ToInt32(row["month"]); 
       dow = Convert.ToInt32(row["dow"]); 
       endmonth = Convert.ToInt32(row["endmonth"]); 
       date1 = Convert.ToDateTime(row["date1"]); 

       cmd.CommandText = @"insert into calendFull values ('" + date1 + "'," + day + "," + month + "," + year + "," + dow + "," + endmonth + ")"; 
       cmd.ExecuteNonQuery(); 
      } 
+0

哪裏代碼**創建文件?**我在這裏錯過了什麼嗎? –

+0

我更新了問題以包含整個代碼,創建並填充 – SKGeek

回答

0

DBF文件名遵循8.3命名規範,所以名稱不能超過8個字符。

別急,我已經看到了一些名字DBF文件較大的是8個字符。

是的,它是允許的,但是當您查看命令提示符時,它們的實際名稱就像是文件名。例如largef~1

那麼我怎麼讀它們?你應該使用KERNEL32.DLL

這裏是代碼得到他們的短名稱:

public string GetShortFileName(string fileDirectory, string fileNameWithExtension) 
    { 
     StringBuilder temp = new StringBuilder(255); 

     string path = System.IO.Path.Combine(fileDirectory, fileNameWithExtension); 

     int n = GetShortPathName(path, temp, 255); 

     if (n == 0) 
      throw new NotImplementedException(); 

     string extension = System.IO.Path.GetExtension(path); 

     return ((temp.ToString().Split('\\')).Last()).ToLower();//.Replace(extension, string.Empty); 
    } 

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
      public static extern int GetShortPathName(
     [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]  
     string path, 
     [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]  
     StringBuilder shortPath, 
     int shortPathLength); 
+1

使用'kernel32.dll'獲取短名稱?多年來,我一直在使用dBASE和FoxPro。文件名稱可以和超過8個字符,並且可以在Windows中被全名引用。也有一些是更這張圖片 - 這是***顯然不被顯示,因爲由OP提供的代碼無關文件名或者它的名字*** –

+1

我一直用'dbf'文件。還有幾年。我見過這個問題。你可以搜索它(dbf文件名的限制),看看我是否真實。 –

+1

@MichaelPerrenoud請參閱此(http://social.msdn.microsoft.com/Forums/en-US/visualfoxprogeneral/thread/fcb3505d-a6fe-400c-9345-eb75fd8f1747/)。似乎它發生在使用'Microsoft.Jet.Oledb'時 –

0
 const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;"; 
     OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName)); 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn) 

更改OLEDB提供:

Use Microsoft OLE DB Provider for Visual FoxPro 9.0