为什么我的代码不能正常工作?

时间:2017-05-13 13:42:46

标签: c# sql sql-server ado.net

我想检查逻辑表中是否存在逻辑名称。我的查询和过程正常工作,但在C#代码中它无法正常工作。假设ExecuteSchalar()返回0或1然后我检查它并显示一个消息框或继续其他代码。我的代码在下面

string LogicNameCheck_Query = "exec searchLogicName '{0}'";
        LogicNameCheck_Query = string.Format(LogicNameCheck_Query , txtLogicName);
        SqlCommand sc = new SqlCommand();
        sc.Connection = sqlConnection1;
        sc.CommandText = LogicNameCheck_Query;

        if (sqlConnection1.State != ConnectionState.Open)
        {
            sqlConnection1.Open();
        }
        int existLogicName = Convert.ToInt32(sc.ExecuteScalar());

        MessageBox.Show(existLogicName +"");
        if(existLogicName == 1)
        {
            MessageBox.Show("name is exist");
            return;
        }
        if (sqlConnection1.State != ConnectionState.Closed)
        {
            sqlConnection1.Close();
        }

下面是searchLogicName过程代码:

ALTER procedure [dbo].[searchLogicName]
@LogName varchar(50)
 as
IF EXISTS  (select * from Logic where LogicName = @LogName)
select 1 else select 0

1 个答案:

答案 0 :(得分:0)

txtLogicName 是一个TextBox。如果按原样放入字符串格式参数,则会返回类IE System.Windows.Forms.TextBox 的名称,而不是文本框的内容。内容来自Text属性。

但是,您应该更改逻辑以使用参数化查询来避免Sql Injection并解析问题(txtLogicName中的单引号将破坏您的string.Format代码)

CustomerID    CustomerName  Bank  Amount 
   1          Martin        BDO   Php 55.00 
   1          Martin        CBA   Php 150.00 
   2          Grace         BDO   Php 45.00
   2          Grace         BDO   Php 4100.00
   3          Blake         BPI   Php 120 

需要考虑的其他要点:
你不需要执行任何操作。 SqlCommand可以直接使用存储过程的名称,前提是您通知它您的commandtext是storedprocedure的名称。这是使用CommandType property完成的。

第二点要尽快改变。避免保留全局连接对象,然后每次检查它是否打开。只需使用在using statement内创建的本地SqlConnection变量。这样可以保证在完成连接后正确关闭和处理连接使用的资源。这样做没有任何惩罚,因为SqlClient类使用名为Connection Pooling

的基础结构