小编Geo*_*Ego的帖子

线程和Winforms形式重绘

我刚刚写了一个简单的应用程序来学习多线程,我错过了一些东西.我启动一个新线程,执行相对冗长的数据库操作(检查特定站点的用户的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都不会刷新,并且在线程处理期间应用程序被锁定 - 计时器甚至不会触发,尽管它应该每秒钟滴答一次,数据库操作最多需要十五次.有人能告诉我我做错了什么吗?

.net c# multithreading winforms

2
推荐指数
1
解决办法
555
查看次数

将主键添加到生产数据库

我只是继承了一个相对较小的SQL Server数据库。我们有一个分散的系统,可在大约十个站点上运行,每个站点整日受到60至100个客户的追捧。在检查系统时,有几件事让我惊讶:没有定义维护计划或密钥。

我有许多不同的应用程序已经在访问数据库。它们中的大多数是用内联SQL用C编写的。我从事的部分工作是为所有内容编写存储过程,并让我们的应用程序移至该过程。但是,在执行此操作之前,我真的认为我应该专注于这些看似明显的问题。

另外,我们最终将研究复制到中央站点,因此我真的认为应该在考虑之前解决这些问题。

弄清楚重新设计方案和维护计划将很耗时,但不会出现问题-我之前已经在单个站点上做到了。但是,在确保数据完整性且不破坏应用程序的情况下,我将如何在十个(或更多)生产站点上对数据库进行这些重大更改?

sql-server database-design production-environment database-schema

2
推荐指数
1
解决办法
541
查看次数

SQL UPDATE循环非顺序键

我正在编写一个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 sql-server database-update

1
推荐指数
2
解决办法
1530
查看次数

Sql Datareader为null值

我正在从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# sql null if-statement datareader

1
推荐指数
1
解决办法
5736
查看次数

随机数字字符串,不包括特定数字

我正在使用C#中的.NET应用程序生成一个可变长度的随机数字字符串.我想添加一个清单,允许用户选择0到9之间的任何数字组合,并防止它们出现在字符串中.目前,我只是这样做以获取字符串:

do
{
   int num = rnd.Next(10);
   output += num.ToString();
   i++;
}
while (i < stringLength);
Run Code Online (Sandbox Code Playgroud)

我可以想出一种方法来排除选定的数字,一旦生成它们就把它们抛出而不是递增计数器,但似乎会有一个不那么浪费的算法.该程序将支持生成许多字符串,因此如果用户创建了数百万字符串,我希望将开销保持在最低限度.

额外奖励:我忘了提及我也想,如果有人能指出我这样的模式的资源.在不久的将来,我会根据参数随机编号,我会学习一些原则,而不是询问有关个别问题的问题.

.net c# random

1
推荐指数
1
解决办法
3847
查看次数

Windows 7和VB6:事件错误ID 1000

我在现场的某个特定软件上弹出一个完全随机的错误.该应用程序是一个用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中缺少符号.有线索吗?

crash windows-7

1
推荐指数
1
解决办法
3386
查看次数

按住键时VB6应用程序崩溃

我有一个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.我遇到的问题是,如果我将其中一个键按下大约十秒钟,应用程序就会崩溃 - 没有例外,只是停止执行.我确实收集了一些小型转储,我没有看到任何可以提供任何有用信息的内容,但我没有阅读它们的经验.

我需要知道为什么应用程序似乎无法处理按键流以及如何绕过它.

vb6 crash keypress crash-dumps

1
推荐指数
1
解决办法
173
查看次数

字节分配不一致

尝试将一个字节数组的一部分分配给两个单独的字节数组时,我有一些奇怪的行为,作为串行命令在不同的串行端口上发送出去.我已经打破了代码,以便能够更轻松地完成它; 问题很容易重复,但对我来说毫无意义.

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,内容cmd1cmd2将是相同的每一次- [3][4]两个cmd1cmd2将包含数据parameterBytesCmd1[0][1].

FWIW,这发生在一个单独的线程上.

.net c# arrays multithreading

1
推荐指数
1
解决办法
47
查看次数

来自TextBox的ADO.NET参数

我试图在我的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()方法,无论如何看起来毫无意义,并抛出相同的错误.我错误地传递了参数吗?

c# parameters ado.net stored-procedures sql-server-2005

0
推荐指数
1
解决办法
1539
查看次数

访问未知类型的特定属性

我期待测试窗体上的所有控件,如果给定的控件是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的属性列表.

.net c# controls textbox winforms

0
推荐指数
1
解决办法
238
查看次数