我有一个winform应用程序,它创建了5个线程来连接并在非常慢的连接上从数据库中检索信息(对于某些查询来说是90秒).每个线程都有自己的类实例来执行sql查询.当检索到查询的数据时,主线程将由运行查询的类触发的事件通知.在接收到事件之后,主线程的各种组件被更新,例如显示项目或仅仅是数据表保存数据以供以后使用.根据查询的信息类型,以不同的间隔重复查询.
一切都很好......但我不开心.我觉得它应该以不同的方式完成,但我不确定哪种方式.
以下是我目前如何设置每个线程:
string ConnectionString = @"Data Source=mySrv;Initial Catalog=myTbl;Connect Timeout=30;UID=sa;pwd=mypwd";
//thread #1
SQL_Requests ReasonRequests;
Thread Reason_Thread;
ReasonRequests = new SQL_Requests();
ReasonRequests.ProcessFinished += new SQL_Requests.ProcessFinished(ReasonRequests_Completed);
Reason_Thread = new Thread(ReasonRequests.ExecuteQuery);
ReasonRequests.DBQueryString = "select * from ReasonTable where staralingment = goodalignment"
ReasonRequests.DBConnection = ConnectionString;
//thread #2
SQL_Requests EventRequests;
Thread Event_Thread;
EventRequests = new SQL_Requests();
EventRequests.ProcessFinished += new SQL_Requests.ProcessFinished(EventRequests_Completed);
Event_Thread= new Thread(EventRequests.ExecuteQuery);
EventRequests.DBQueryString = "select * from EventTable where somefield = somevalue"
EventRequests.DBConnection = ConnectionString;
Run Code Online (Sandbox Code Playgroud)
每个Thread.start都有不同的间隔.
任何建议?
我有登录页面的问题.如果我不输入用户名或密码,它应该说"请输入一个用户名或密码"而不是它去目的地页面我的意思是没有在登录字段输入任何东西如果我点击提交按钮它将欢迎页面实际上哪个不应该发生.
这是我的代码请有人告诉我我的错误在哪里:
public class Login
{
public string str = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();
public int GetLogin(string UserName, string Password)
{
SqlConnection con = new SqlConnection(str);
SqlDataAdapter da = new SqlDataAdapter("select * from Login where UserName='"+UserName+"' and Password='"+Password+"'",con);
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
if ((ds.Tables[0].Rows[0].ItemArray[0].ToString() == UserName) && (ds.Tables[0].Rows[0].ItemArray[1].ToString() == Password))
{
return 1;
}
else
{
return 0;
}
}
else
{
return -1;
}
}
Login.aspx.cs:
protected void BtnLogin_Click(object sender, EventArgs e)
{
Session["UserName"] = …Run Code Online (Sandbox Code Playgroud) 示例查询:
select *
from A join B on A.ID = B.SOMEVALUE
where A.VALUE="something" and
B.ID =
(select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...))
Run Code Online (Sandbox Code Playgroud)
因此,如果您可以阅读SQL,您应该看到我正在做一些相关的子查询来缩小连接的结果.(是的,这非常简化).
在某些情况下子查询:
select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...)
Run Code Online (Sandbox Code Playgroud)
可以返回多于1个值,这会导致错误
"子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做."
我完全期待.这显然不是一件好事,我有代码(希望)防止这些重复项首先进入数据库(即表B 应该只有1行匹配
SOMEVALUE = A.ID and max(SOMEDATE)
Run Code Online (Sandbox Code Playgroud)
然而,最终用户如果没有创造性,却找不到破解软件的方法.
所以现在我的问题:
将第一个子查询更改为更好
select top 1 * from B ...
Run Code Online (Sandbox Code Playgroud)
当/如果(希望永远不会)出现这种情况或让错误通过时,防止用户看到错误.我倾向于不添加top语句并让错误通过而不是让用户看到可能不正确的数据.我想知道在这种情况下是否有人对最佳实践有任何想法......
在编程接口时,我发现我正在进行大量的转换或对象类型转换.
这两种转换方法有区别吗?如果是,是否有成本差异或这对我的计划有何影响?
public interface IMyInterface
{
void AMethod();
}
public class MyClass : IMyInterface
{
public void AMethod()
{
//Do work
}
// Other helper methods....
}
public class Implementation
{
IMyInterface _MyObj;
MyClass _myCls1;
MyClass _myCls2;
public Implementation()
{
_MyObj = new MyClass();
// What is the difference here:
_myCls1 = (MyClass)_MyObj;
_myCls2 = (_MyObj as MyClass);
}
}
Run Code Online (Sandbox Code Playgroud)
另外,什么是"一般"首选方法?
我有一个用例,其中数字在整数向量中单调递增
vec[0] = 2
vec[1] = 5
vec[2] = 8
vec[3] = 10
..
Run Code Online (Sandbox Code Playgroud)
如果我通过了6号,我想返回vec [1],因为它位于vec [1]和vec [2]之间,类似地,如果pass 9必须返回vec [2].我对STL的经验是有限的,所以想检查一下我们可以用STL解决这个问题,或者你必须通过存储前一个来迭代每一个,当你点击一个大于你返回的传递数的数字时
我们使用 Sajax 向站点添加小型 Ajax 代码。在遇到问题并进行一些挖掘后,该库似乎自 2005 年以来就没有更新过。
我很欣赏 Sajax 的轻量级、易于使用且易于安装(只需将文件包含在 PHP 中)。
那么,在 LAMP 堆栈上,如果您以前使用过 Sajax,您会升级到什么?易用性是关键,因为一些半程序员 Web 开发人员也使用该代码。
我知道很多人会说 jQuery,但这真的像 Sajax 一样简单吗?
我在SQL Server中的日志文件耗尽了磁盘上的所有空间.我每晚都运行完整备份,但日志文件不断增长.我能做什么?
我想在numericUpDown的值改变时隐藏一些东西,所以我写了这个:
if (numericUpDown1.Value = 1)
{
Label1.Hide();
}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
无法将类型'decimal'隐式转换为'bool'
为什么会这样?
为了使我的emacs设置更便携,我希望能够通过指定文件而不是字体名称来设置当前字体,即"Load~/config/myfont.ttf并使用大小12".有没有办法在我的.emacs中做到这一点?我发现的所有说明都假定字体已经安装在系统上.我正在Linux上使用XFT支持,所以Linux特定的黑客行为可以,但我更喜欢能适用于所有目标的东西.
更新:要清楚,我使用的是Windows/OS X/Linux上不标准的字体.我不只是想基于平台设置不同的字体,而是指定我拥有的特定字体文件(TTF在Windows和Linux上工作,如果不在Mac上我会得到该文件的另一个版本,但我仍然想要通过文件而不是名称指定字体).
以下两个switch/case语句的更好实践是什么?
有没有更简单的方法(更少的代码)来做到这一点?
switch (myValue)
{
case 1:
{
methodFor1();
break;
}
case 2:
case 3:
{
methodFor2or3();
if (myValue == 2)
methodFor2();
if (myValue == 3)
methodFor3();
break;
}
}
...or...
switch (myValue)
{
case 1:
{
methodFor1();
break;
}
case 2:
case 3:
{
methodFor2or3();
switch (myValue)
{
case 2:
{
methodFor2();
break;
}
case 3:
{
methodFor3();
break;
}
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)