Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OleDbParameter创建用于访问的表_C#_Ms Access_Oledb - Fatal编程技术网

C# 使用OleDbParameter创建用于访问的表

C# 使用OleDbParameter创建用于访问的表,c#,ms-access,oledb,C#,Ms Access,Oledb,我目前正在从SQL Server重建表,以便通过C#访问 为此,我将获取SQL Server中使用的数据类型,并将它们映射到OleDbType对象 不幸的是,每次我试图执行我的访问语句时,都会抛出一个异常,即我的“CREATETABLE”语句中存在语法错误。我猜这是因为我只是将映射数据类型添加为文本,而不是OLEDB参数 有没有办法创建OleDbParameter对象,这些对象包含“CREATETABLE”语句的列名和数据类型 String accessConnectionString = "P

我目前正在从SQL Server重建表,以便通过C#访问

为此,我将获取SQL Server中使用的数据类型,并将它们映射到OleDbType对象

不幸的是,每次我试图执行我的访问语句时,都会抛出一个异常,即我的“CREATETABLE”语句中存在语法错误。我猜这是因为我只是将映射数据类型添加为文本,而不是OLEDB参数

有没有办法创建OleDbParameter对象,这些对象包含“CREATETABLE”语句的列名和数据类型

String accessConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data 
Source=" + filepath;

using (OleDbConnection accessConnection = new OleDbConnection(accessConnectionString))
{
     ADOX.Catalog cat = new ADOX.Catalog();
     cat.Create(accessConnectionString);
     OleDbCommand oleCommand = new OleDbCommand();
     oleCommand.Connection = accessConnection;
     oleCommand.CommandType = CommandType.Text;
     accessConnection.Open();

     String columnsCommandText = "(";

     for (int i = 0; i < reader.GetSchemaTable().Rows.Count; i++) // reader contains data from SQL Server 
     {
         var column = reader.GetName(i); // name of attribute
         SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[i]["ProviderType"]; // data type
         var accessType = SQLAccessMapper.MapDataTypes(type);
         columnsCommandText +=  " " + column + " " + accessType + ",";
     }

     columnsCommandText = columnsCommandText.Remove(columnsCommandText.Length - 1);
     columnsCommandText += ")";

     oleCommand.CommandText = "CREATE TABLE " + tablename + columnsCommandText;

     oleCommand.ExecuteNonQuery(); // Exception
示例
Create Table
语句:

CREATE TABLE GrTable(
GrtId Integer, 
CaseId Integer, 
GrDrg VarChar, 
GrDrgText VarWChar, 
Mdc VarChar, 
MdcText VarWChar, 
GrPartition VarChar, 
Baserate Decimal, 
LosUsed Integer, 
Htp Integer, 
PricePerDay Decimal, 
Ltp Integer, 
LtpPricePerDay Decimal, 
AverLos Decimal, 
AverlosPricePerDay Decimal, 
Eff Decimal,
Std Decimal,
Adj Decimal, 
Gst VarChar, 
Pccl Integer,
PriceEff Decimal,
PriceStd Decimal, 
PriceAdj Decimal, 
DaysExcHtp Integer,
DaysBelowLtp Integer, 
DaysBelowAverLos Integer, 
TotalPrice Decimal,
BaseratePeriod VarChar)

您的主要问题在于MapDataTypes。您应该返回MS Access引擎所期望的字符串,而不是像现在这样依赖于将常规enum SqlDbType自动转换为字符串

比如说。对于VarWChar类型的列,需要传递字符串“TEXT”,后跟字段大小,而对于integer类型的字段,需要字符串“INT”

当然,这会给文本字段带来大小问题,但是您可以从用于在名为ColumnSize的列中查找类型并将此大小传递给MapDataTypes方法的同一个GetSchemaTable中检索它-

public static string MapDataTypes(SqlDbType sqlDataType, int size)
{
    switch (sqlDataType)
    {
        case SqlDbType.Int:
            return "INT";
        case SqlDbType.VarChar:
            return "TEXT(" + size + )";
        .....


   }
}

您可以在这里找到一些允许的类型。您的主要问题在于MapDataTypes。您应该返回MS Access引擎所期望的字符串,而不是像现在这样依赖于将常规enum SqlDbType自动转换为字符串

比如说。对于VarWChar类型的列,需要传递字符串“TEXT”,后跟字段大小,而对于integer类型的字段,需要字符串“INT”

当然,这会给文本字段带来大小问题,但是您可以从用于在名为ColumnSize的列中查找类型并将此大小传递给MapDataTypes方法的同一个GetSchemaTable中检索它-

public static string MapDataTypes(SqlDbType sqlDataType, int size)
{
    switch (sqlDataType)
    {
        case SqlDbType.Int:
            return "INT";
        case SqlDbType.VarChar:
            return "TEXT(" + size + )";
        .....


   }
}

您可以在此找到一些允许的类型,因为使用参数是不可能完成的。你这样做是对的。只需对
OLECTOMAND.CommandText
中的值进行故障排除即可。我相信问题就在那里。发布分配给CommandText的完整值,您可以使用调试器获取该值。首先,
VARCHAR
列需要定义一个显式长度,否则,您将得到最大长度为1的列。。。。。这通常不是你想要的。。。。使用
VARCHAR(n)
并定义长度
n
!很抱歉,使用参数是不可能完成的。你这样做是对的。只需对
OLECTOMAND.CommandText
中的值进行故障排除即可。我相信问题就在那里。发布分配给CommandText的完整值,您可以使用调试器获取该值。首先,
VARCHAR
列需要定义一个显式长度,否则,您将得到最大长度为1的列。。。。。这通常不是你想要的。。。。使用
VARCHAR(n)
并定义长度
n
public static string MapDataTypes(SqlDbType sqlDataType, int size)
{
    switch (sqlDataType)
    {
        case SqlDbType.Int:
            return "INT";
        case SqlDbType.VarChar:
            return "TEXT(" + size + )";
        .....


   }
}