2012-04-01 161 views
0

我想创建一个方法,我可以执行MySQL UPDATE,DELETE或INSERT查询。该方法必须在使用INSERT时请求或请求last_insert_id()。下面是我此刻的代码:C#mysql一个返回last_insert_id

public int executeUID(MySqlCommand msCommand) 
{ 
    try 
    { 
    this.Open(); 

    msCommand.Connection = this.msCon; 

    return int.Parse(msCommand.ExecuteScalar().ToString()); 
    } 
    catch (MySqlException ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    this.Close(); 
    } 
} 

的问题,这是是,当我使用插入查询,返回一个last_insert_id()的方法效果很大。但是,当查询不返回last_insert_id()该方法出现故障。我怎样才能使这种方法工作?

+0

你说的*方法故障* 做到这一点:为什么呢?你对这种方法有什么期望?如果您的查询是select或其他内容,那么您希望该方法返回什么内容? – Marco 2012-04-01 11:25:58

+0

您是否试图获取交易所影响的行? – 2012-04-01 11:37:45

+0

你能展示一个可行的查询例子和一个不起作用的查询例子吗?在_malfunctions_的情况下,你会得到一个异常吗?如果是,那么错误信息是什么? – Steve 2012-04-01 11:38:14

回答

0

为什么不使用OUTPUT PARAMETER,它会返回最后插入的ID。 SqlParamet

如果你知道什么时候可以生成LastInsertID,那么你可以传入一个参数给方法,告诉它正在重试插入ID,根据该参数你可以做一些这样的事情。

public int executeUID(MySqlCommand msCommand, bool Mode) //Mode==true means insertandRetriveLastID, false means =dont retrive last insertedit 
{ 
    try 
    { 
    this.Open(); 

    msCommand.Connection = this.msCon; 

    if(Mode) //for getting last inserted id 
    { 
     SqlParameter outParams= new SqlParameter("@ID", SqlDbType.Int); 
     outParams.Direction = ParameterDirection.Output; 
     msCommand.Parameters.Add(outParams) 
     msCommand.ExecuteNonQuery(); 
     var outputValue = cmd.Parameters["@ID"].Value; 
    } 
    else //if no inserted id is not there 
    { 
     return msComand.ExecuteNonQuery(); // it will return No of Rows Affected. 
    } 

    } 
    catch (MySqlException ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    this.Close(); 
    } 
} 

PS:你需要调整它的一些更多更好的效率,因为我给了一些基本的想法如何,我们可以在没有参数

+0

是的,这应该工作。然而,从干净的代码角度来看这是一个非常糟糕的做法。一种方法应该只做一件事,这里不是这种情况。正确的解决方案是将其拆分为两种新方法,而不是在模式间切换时添加bool ...... – walther 2012-04-01 12:03:59

+0

我希望我的代码尽可能干净。所以一定不能有任何方法可以做很多事情 – Bernhard 2012-04-01 12:22:46