2013-04-02 87 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