我刚刚写了一个简单的应用程序来学习多线程,我错过了一些东西.我启动一个新线程,执行相对冗长的数据库操作(检查特定站点的用户的SharePoint权限),通常长达十五秒.这就是我创建线程的方法(为简单起见,删除了一些无关的代码):
private void btnSelectSite_Click(object sender, EventArgs e)
{
strSiteURL = txtSiteURL.Text;
tmrProgressTimer.Interval = 1000;
tmrProgressTimer.Enabled = true;
ThreadStart starter = delegate { LoadUsers(strSiteURL); };
Thread t = new Thread(starter);
t.Start();
t.Join();
cboUsers.Items.Clear();
cboUsers.Items.AddRange(list.ToArray());
tmrProgressTimer.Enabled = false;
}
Run Code Online (Sandbox Code Playgroud)
我使用委托在自己的线程中触发LoadUsers,因为LoadUsers需要一个字符串.它填充了一个通用列表(代码中的"列表"),之后我用它来填充组合框.我的理解是,当这个线程处理时,我的UI不应该锁定,就像它在自己的线程上一样; 然而,事实并非如此.在线程完成之前,UI都不会刷新,并且在线程处理期间应用程序被锁定 - 计时器甚至不会触发,尽管它应该每秒钟滴答一次,数据库操作最多需要十五次.有人能告诉我我做错了什么吗?
我只是继承了一个相对较小的SQL Server数据库。我们有一个分散的系统,可在大约十个站点上运行,每个站点整日受到60至100个客户的追捧。在检查系统时,有几件事让我惊讶:没有定义维护计划或密钥。
我有许多不同的应用程序已经在访问数据库。它们中的大多数是用内联SQL用C编写的。我从事的部分工作是为所有内容编写存储过程,并让我们的应用程序移至该过程。但是,在执行此操作之前,我真的认为我应该专注于这些看似明显的问题。
另外,我们最终将研究复制到中央站点,因此我真的认为应该在考虑之前解决这些问题。
弄清楚重新设计方案和维护计划将很耗时,但不会出现问题-我之前已经在单个站点上做到了。但是,在确保数据完整性且不破坏应用程序的情况下,我将如何在十个(或更多)生产站点上对数据库进行这些重大更改?
sql-server database-design production-environment database-schema
我正在编写一个C#应用程序,它将更新SQL Server数据库中的字段.我正在测试的当前算法只是从"状态"字段中提取数据,将每个值存储在ArrayList中,将其大写,然后将其写回数据库.我遇到逻辑问题.
我将所有值都拉入ArrayList并将它们大写.这工作正常.我现在有一个数组,例如,100个值(即myArray[0]- myArray[99]).然后我使用FOR循环将值写回数据库:
for (int i = 0; i <= (myArray.Count - 1); i++)
{
SqlCommand myCommand =
new SqlCommand("UPDATE myList SET State = '" + recordArray[i].ToString() +
"' WHERE uniqueID = '" + (i + 1) + "'", dbConnection);
myCommand.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
我在上面的例子中使用"uniqueID"来根据主键放置这些值.然而,问题是主键几乎是顺序的; 序列中有一些缺失的数字.因此,即使我确切地拥有了我需要的值的数量,并且它们在数组中以正确的顺序被推回到数据库中,一旦我在序列中失效,其余的数据就会被放置在错误的领域.我知道这是我的逻辑失误,但我不知道如何确保正确地放置每个单独的价值.
在此先感谢您的帮助.
我正在从C#中的SQL datareader读取并将列中的值传递给下拉列表.正在读取两列.使用IsDbNull,我能够处理空值.但是,由于我现在编写了代码,如果dr.GetString(0)为null,则根本不会传递任何值,而只要dr.GetString(1)(或两者都不是)为null,所有的传递值并忽略空值.以下是datareader读取时的内容:
while (dr.Read())
{
if (!dr.IsDBNull(0))
{
machineName.Items.Add(dr.GetString(0).ToString());
}
else if (!dr.IsDBNull(1))
{
machineName.Items.Add(dr.GetString(1).ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是使用datareader返回的任何值填充dropdownlist,无论它们位于哪个列.我已经删除了using和try/catch语句以便对代码进行整理.感谢大家.
我正在使用C#中的.NET应用程序生成一个可变长度的随机数字字符串.我想添加一个清单,允许用户选择0到9之间的任何数字组合,并防止它们出现在字符串中.目前,我只是这样做以获取字符串:
do
{
int num = rnd.Next(10);
output += num.ToString();
i++;
}
while (i < stringLength);
Run Code Online (Sandbox Code Playgroud)
我可以想出一种方法来排除选定的数字,一旦生成它们就把它们抛出而不是递增计数器,但似乎会有一个不那么浪费的算法.该程序将支持生成许多字符串,因此如果用户创建了数百万字符串,我希望将开销保持在最低限度.
额外奖励:我忘了提及我也想,如果有人能指出我这样的模式的资源.在不久的将来,我会根据参数随机编号,我会学习一些原则,而不是询问有关个别问题的问题.
我在现场的某个特定软件上弹出一个完全随机的错误.该应用程序是一个用VB6编写的游戏,运行在64位Windows 7上.每隔一段时间,应用程序崩溃,通用"program.exe已停止响应"消息框.这个游戏可以连续好几天运行,直到出现此消息,或者在几个小时内.没有例外被抛出.
我们在Windows 2000兼容模式下运行此应用程序(这是其原始操作系统),禁用了可视主题,并以管理员身份运行.在使用外部组件和API调用方面,应用程序本身非常简单.
参考文献:
Visual Basic for Applications
Visual Basic运行时对象和过程
Visual Basic对象和过程
OLE自动化
Microsoft DAO 3.51对象库
Microsoft数据格式对象库
组件:
Microsoft Comm Control 6.0
Microsoft Windows Common Controls 6.0(SP6)
Resizer XT
正如您所看到的,这些是非常简单的Microsoft标准工具.存在数据库组件以与用于簿记的Access数据库交互,并且插入Resizer XT以将该游戏从其原始800x600分辨率更容易地移动到1920x1080.
在自助服务终端上没有启用网络连接; 没有网络驱动程序,因此没有连接到远程数据库.一切都封装在一个盒子里.
在Windows应用程序事件日志中,当发生这种情况时,会出现一个事件ID 1000错误的看似随机的模块 - 到目前为止,无论是ntdll.dll还是lpk.dll.在API调用方面,我没有看到任何来自ntdll.dll.我们使用kernel32,user32和winmm,用于各种文件系统和声音功能.我无法重现,因为它是完全随机的,所以我甚至不知道从哪里开始故障排除.有任何想法吗?
编辑:更多信息.在其他一些开发人员的建议下,我尝试了几个不同版本的Dependency Walker,最新版本显示我缺少IESHIMS.dll和GRPSVC.dll(这两个似乎是Depends.exe中众所周知的错误) ,我在COMCTRL32.dll和IEFRAME.dll中缺少符号.有线索吗?
我有一个VB6应用程序,其表单通过其KeyPress事件处理输入.在该方法中,它检查通过一系列if语句传递了什么ASCII代码,并运行必要的代码来响应输入.所以,基本格式是:
Private Sub Form_Keypress (KeyAscii As Integer)
If KeyAscii = 97
' Do some stuff
If KeyAscii = 98
' Do some different stuff
End Sub
Run Code Online (Sandbox Code Playgroud)
有24个键连接到键盘编码器,提供从信息亭前面的按钮输入.操作系统是Windows 7.我遇到的问题是,如果我将其中一个键按下大约十秒钟,应用程序就会崩溃 - 没有例外,只是停止执行.我确实收集了一些小型转储,我没有看到任何可以提供任何有用信息的内容,但我没有阅读它们的经验.
我需要知道为什么应用程序似乎无法处理按键流以及如何绕过它.
尝试将一个字节数组的一部分分配给两个单独的字节数组时,我有一些奇怪的行为,作为串行命令在不同的串行端口上发送出去.我已经打破了代码,以便能够更轻松地完成它; 问题很容易重复,但对我来说毫无意义.
byte[] cmd1 = CLEAR_COMMAND;
byte[] cmd2 = CLEAR_COMMAND;
byte[] parameterBytesCmd1 = IntToByteArray(parameter1);
cmd1[3] = parameterBytesCmd1 [0];
cmd1[4] = parameterBytesCmd1 [1];
Thread.Sleep (100);
byte[] parameterBytesCmd2 = IntToByteArray(parameter2);
cmd2[3] = parameterBytesCmd2 [0];
cmd2[4] = parameterBytesCmd2 [1];
Run Code Online (Sandbox Code Playgroud)
您可以看到我正在使用几个整数参数,将它们转换为字节数组,然后将它们放入我构建的命令模板中的特定位置.如果我这样做,而不在中间睡至少100ms,内容cmd1和cmd2将是相同的每一次- [3]和[4]两个cmd1和cmd2将包含数据parameterBytesCmd1[0]和[1].
FWIW,这发生在一个单独的线程上.
我试图在我的C#Winforms应用程序中从SQL Server 2005调用参数化存储过程.我从TextBoxeslike添加参数(其中有88个):
cmd.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
"System.InvalidCastException: Failed to convert parameter value
from a TextBox to a String. ---> System.InvalidCastException:
Object must implement IConvertible."
Run Code Online (Sandbox Code Playgroud)
抛出错误的行是我调用查询时:
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
我也尝试在TextBoxes上使用.ToString()方法,无论如何看起来毫无意义,并抛出相同的错误.我错误地传递了参数吗?
我期待测试窗体上的所有控件,如果给定的控件是TextBox,我想记录该控件的MaxLength属性.我可以像这样测试每个控件:
foreach (Control ctrl in this.Controls)
{
if (ctrl is TextBox)
{
// Get the MaxLength property.
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何获取控件的MaxLength属性,因为它特定于TextBox而不是ctrl的属性列表.
c# ×7
.net ×4
crash ×2
sql ×2
sql-server ×2
winforms ×2
ado.net ×1
arrays ×1
controls ×1
crash-dumps ×1
datareader ×1
if-statement ×1
keypress ×1
null ×1
parameters ×1
random ×1
textbox ×1
vb6 ×1
windows-7 ×1