2017-05-04 203 views
-1
public static void WriteData(string colName,string data) 
{ 
    using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\"")) 
    { 
     // string query = String.Format("INSERT INTO [DataSet$]({0}) VALUES ({1})",colName, data); 

     string query = String.Format("INSERT INTO [DataSet$]({0}) VALUES ({1})", colName, data); 
     cn.Open(); 
     OleDbCommand cmd = new OleDbCommand(query, cn); 
     cmd.Parameters.AddWithValue("@colName", colName); 
     cmd.Parameters.AddWithValue("@data", data); 

     cmd.ExecuteNonQuery(); 
     cn.Close(); 
     cn.Dispose(); 
    } 
} 
+0

我不知道你在问什么,但请注意,代码因为它是容易受到SQL注入攻击。 – AKX

+0

我无法将数据插入到工作表中,并且抛出了上述异常。 – darsi567

+0

我是新来的C#和SQL。任何人都可以帮助解决上述语法错误? – darsi567

回答

0

您试图执行的操作是混合动态查询生成和查询参数。 您不能使用命令参数填充查询中的列名称。参数仅用于将值传递给查询。

因此,您需要做的是仅使用string.Format将列名放入查询中,并使用命令参数仅将数据传递给查询。

public void WriteData(string colName, string data) 
{ 
    using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\"")) 
    { 
     string query = string.Format("INSERT INTO [DataSet$] ({0}) VALUES (@data)", colName); 
     // The query variable will have following value assuming colName=token 
     //INSERT INTO [DataSet$] (token) VALUES (@data) 
     cn.Open(); 
     //Now use OleDbCommand to pass value of @data to the query. 
     OleDbCommand cmd = new OleDbCommand(query, cn); 
     cmd.Parameters.AddWithValue("@data", data); 

     cmd.ExecuteNonQuery(); 
     cn.Close(); 
    } 
} 

这应该有助于您解决问题。

+0

感谢您的回复Chetan。你能不能让我知道如何更新表? – darsi567

+0

需要插入rowname,colname和数据。 – darsi567

+0

这是什么rowname?你有多个列需要更新?你已经尝试过一些代码吗?此解决方案是否适用于INSERT操作? –

0
public static void UpdateData(string keyName,string colName,string data) 
    { 
     using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\"")) 
     { 
      // string query = String.Format("INSERT INTO [DataSet$]({0}) VALUES ({1})",colName, data); 

       connection.Open(); 
       string commandString = String.Format("UPDATE [DataSet$] SET colName ='{0}' WHERE keyName = '{1}'",@data,@keyName); 
       OleDbCommand cmd = new OleDbCommand(commandString, connection); 
      cmd.Parameters.AddWithValue("@data", data); 
      cmd.Parameters.AddWithValue("@keyName", keyName); 
      connection.Close(); 
       connection.Dispose(); 
      } 
     } 
    } 
+0

您需要遵循与我的答案相同的方法。使用string.format填充列名和命令参数以填充值。 –

+0

这里的关键字是什么?这是一个专栏名称?那么你也需要有价值。你能解释一下你需要这样做的用例吗?您的这段代码与您的第一段代码有相同的问题。 –

+0

你能分享keyname,colname和数据的样本值吗? –

相关问题