C# 程序在IF/Else SQL语句期间挂起
我正在创建一个注册应用程序,它有两种工作方式:在线和离线。我们使用条形码将自己扫描到应用程序中。当您扫描在线条形码时,它将为您提供6个数字和一个“L”,例如242565L,程序将提取该数字并在SQL数据库中搜索相应的ID号。脱机条形码包含带有“”的名称文本值,例如Smith,John 当我运行它并扫描在线条形码时,它工作正常。 但当我断开与internet的连接,使它找不到数据库,并扫描我的代码时,它会拾取一个字母,然后冻结并挂起,直到我停止该过程 有什么想法吗?新到C# 以下是主要代码:C# 程序在IF/Else SQL语句期间挂起,c#,if-statement,C#,If Statement,我正在创建一个注册应用程序,它有两种工作方式:在线和离线。我们使用条形码将自己扫描到应用程序中。当您扫描在线条形码时,它将为您提供6个数字和一个“L”,例如242565L,程序将提取该数字并在SQL数据库中搜索相应的ID号。脱机条形码包含带有“”的名称文本值,例如Smith,John 当我运行它并扫描在线条形码时,它工作正常。 但当我断开与internet的连接,使它找不到数据库,并扫描我的代码时,它会拾取一个字母,然后冻结并挂起,直到我停止该过程 有什么想法吗?新到C# 以下是主要代码:
{
SqlConnection DBConnection = new SqlConnection("DataSource=DATABASE;Initial Catalog=imis;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
Object returnValue;
string txtend = textBox1.Text;
try
{
DBConnection.Open();
}
catch
{
DBConnection.Close();
}
if (DBConnection.State == ConnectionState.Open)
{
if (textBox1.Text.Length != 7) return;
cmd.CommandText = "SELECT last_name +', '+ first_name +'\t ('+major_key+')\t' from name where id ='" + textBox1.Text.Replace(@"L", "") + "'";
// MessageBox.Show(textBox1.Text.Replace(@"L", ""));
cmd.CommandType = CommandType.Text;
cmd.Connection = DBConnection;
// sqlConnection1.Open();
returnValue = cmd.ExecuteScalar() + "\t (" + textBox1.Text.Replace(@"L", "") + ")";
DBConnection.Close();
if (listBox1.Items.Contains(returnValue))
{
for (int n = listBox1.Items.Count - 1; n >= 0; --n)
{
string removelistitem = returnValue.ToString();
if (listBox1.Items[n].ToString().Contains(removelistitem))
{
// listBox1.Items.RemoveAt(n);
}
}
}
else
listBox1.Items.Add(returnValue);
textBox1.Text = null;
if (listBox1.Items.Count != 0) { DisableCloseButton(); }
else
{
EnableCloseButton();
}
label6.Text = "Currently " + listBox1.Items.Count.ToString() + " in attendance.";
}
else
{
try
{
string lastTwoChars = txtend.Substring(txtend.Length - 1);
returnValue = textBox1.Text.Replace(@"*", "");
if (lastTwoChars != "*") return;
{
if (listBox1.Items.Contains(returnValue))
{
for (int n = listBox1.Items.Count - 1; n >= 0; --n)
{
string removelistitem = returnValue.ToString();
if (listBox1.Items[n].ToString().Contains(removelistitem))
{
//listBox1.Items.RemoveAt(n);
}
}
}
else
listBox1.Items.Add(returnValue);
textBox1.Text = null;
if (listBox1.Items.Count != 0) { DisableCloseButton(); }
else
{
EnableCloseButton();
}
label6.Text = "Currently " + listBox1.Items.Count.ToString() + " in attendance.";
}
}
catch
{
}
}
}
试着调试它。当程序挂起时暂停,并查看挂起的位置。如果它挂起在SQL查询上,您可能希望对其设置一个超时 另外,您不应该像这样创建查询
cmd.CommandText = "SELECT last_name +', '+ first_name +'\t ('+major_key+')\t' from name where id ='" + textBox1.Text.Replace(@"L", "") + "'";
它对sql注入开放
使用或其他形式的保护:
SqlCommand command = new SqlCommand("SELECT last_name +', '+ first_name +'\t ('+major_key+')\t' from name where id =@Name"
command.Parameters.Add(new SqlParameter("Name", textBox1.Text.Replace(@"L", "")));
编辑
如果要在连接上设置超时,可以查看以下内容:
您可以在连接字符串中设置超时参数,也可以简单地
DBConnection.ConnectionTimeout = yourTime;
这将使连接在等待超时参数后失败。不要使用try..catch来建立活动的db连接,而是使用“using”块 它的效率更高,并且在不再需要时将自动关闭/破坏db连接 通过这种方式,您可以将try-catch块移动到using语句中,并捕获与代码相关的错误,而无需担心是否有打开的数据库连接或internet连接的状态 在本例中,我从自己的代码库中获取了代码,并使用了oracle db连接。您需要将“SQL”替换为“Oracle” 注:db之间的参数声明略有不同。Oracle使用“:”和MsSql使用“@”来指定参数 例如
DataSet myDataSet=新数据集();
使用(OracleConnection conn=新的OracleConnection(connectionString))
{
使用(OracleCommand cmd=new OracleCommand())
{
cmd.BindByName=true;
#区域SQL核心
StringBuilder sql=新的StringBuilder();
sql.Append(“”);
#端区
#区域-添加SQLParameter
//使用参数避免像@param1这样的SQL注入
Append(“AND(columnname=@param1”);
OracleParameter param1=新的OracleParameter(“@param1”,OracleDbType.Varchar2);
param1.Value=yourValue;
cmd.Parameters.Add(param1);
#端区
cmd.CommandText=sql.ToString();
cmd.Connection=conn;
尝试
{
conn.Open();
尝试
{
OracleDataAdapter=新的OracleDataAdapter(cmd);
Fill(myDataSet,“myDataSetName”);
}
catch(异常myex)
{
//处理一般异常
Console.Write(myex);
}
}
捕获(OracleException myex)
{
//处理Oracle异常
Console.Write(myex);
}
}//内部“使用”结束
}//外部“使用”结束
//现在您有了一个已填充的数据集,您可以在其上循环提取值。
//这就像一个离线记录集
//或者,您可以将MyDataSet绑定到GridView以查看脱机表中的数据。
//以预期的XML格式输出结果集并返回
DataTable=myDataSet.Tables[0];
如果(dataTable.Rows.Count>0)
{
for(int i=0;i
抱歉,如果有任何语法错误,这是所有编辑没有智能感知。
这只是给你要点,仅此而已
通过使用脱机数据集,您将减少应用程序挂起。您的SQL超时是多少?它可能正在等待(字面上)永远连接到SQL。例如,在您的SqlCommandoh god中,请使用EntityFramework来执行数据库查询。@Aviatrix、OEM(如EF)并不适合所有人。我们不会在商业上使用它们,因为它们会增加太大的性能开销。我们使用简单的ADO.Net来执行所有SQL,Ryan显然也是一个初学者,所以这是一个很大的赌注ter了解EF在引擎盖下实际在做什么。什么是参考Hanks NoIdeaForName,现在将尝试。谢谢Liam也将加入。是的,我是初学者hahaIt挂在DBConnection.Open()上;
DataSet myDataSet= new DataSet();
using (OracleConnection conn = new OracleConnection(connectionString))
{
using (OracleCommand cmd = new OracleCommand())
{
cmd.BindByName = true;
#region SQL Core
StringBuilder sql = new StringBuilder();
sql.Append(" <Your SQL Here> ");
#endregion
#region - ADD SQLParameter
// use Parameters to avoid SQL Injection like @param1
sql.Append(" AND (columnname = @param1 ");
OracleParameter param1 = new OracleParameter("@param1", OracleDbType.Varchar2);
param1.Value = yourValue;
cmd.Parameters.Add(param1);
#endregion
cmd.CommandText = sql.ToString();
cmd.Connection = conn;
try
{
conn.Open();
try
{
OracleDataAdapter adapter = new OracleDataAdapter(cmd);
adapter.Fill(myDataSet, "myDataSetName");
}
catch (Exception myex)
{
//Handle General Exception
Console.Write(myex);
}
}
Catch (OracleException myex)
{
//Handle Oracle Exception
Console.Write(myex);
}
}//end of inner 'using'
}//end of outer 'using'
//Now you have a populated Data Set, you can loop over it extracting values.
//This acts like an offline record set
//Or you can Bind MyDataSet to a GridView to see the data in your offline table.
//Output Result set in expected XML format and return
DataTable dataTable = myDataSet.Tables[0];
if (dataTable.Rows.Count > 0)
{
for (int i = 0; i < dataTable.Rows.Count; i++)
{
DataRow dataRow = dataTable.Rows[i];
for (int x = 0; x < dataTable.Columns.Count; x++)
{
//dataTable.Rows[i].Table.Columns[x].ColumnName.ToString()
if (dataTable.Rows[i].Table.Columns[x].ColumnName == "YourColumnName")
{
//Get value with dataRow[x]
}
}//end 2nd for
}//end 1st for
}//end outer if.