RawMeterial知识点总结

该软件仍是WINFORM程序,且仍是原来开发一半却中止的程序,现在接手开发,主要遇到以下问题。

首先,对于接手已经开始的程序开发,最主要的是要先熟悉原来的程序模式,然后判断那些内容需要保留,那些内容可以进行修改保留,以及那些内容完全可以删除。在熟悉了基本的程序思路后,即可开始后续的开发工作了。


在编写程序时,虽然可以进行多线程开发,但由于人的注意力是单线程的,因此,程序需要有一个主线,即在运行时,必须考虑到程序的各种可能性,进而对每一种可能性进行分析处理。



1,EXCEL文件操作时某些DLL未引用问题,此可以通过添加相关文件即可解决。


2,某些窗体遗失问题。即在加载程序时,可能遗漏加载某些窗体,但该窗体已经存在项目中了,此时可能显示无此窗体,但却无法重新创建,即显示已存在。此时将选择添加现有项目即可。


3.配置文件设置问题。config.ini为轻量级的配置文件类型ini,以前delphi等语言就喜欢用ini存放配置信息,但是C#中已经很少使用。现在一般配置文件就是xml(web.config、app.config都是xml文件)。但无论那种配置文件,都需要正确设置相应的读写操作逻辑。另外,需注意配置文件正确的存放位置,因为这涉及到是否能成功读写操作。


4.将计算机名称更改后,显示无法链接数据库。后经查看确认为,本地数据库的服务(即在电脑/管理/服务/MSSQLSERVER)的属性中设置了服务启动的登录名称,因此,如果更改了电脑名称,即相当于更改了服务器名称,从而需要重启数据库服务,但此时需要更改该服务的属性,才能进而启动服务及数据库。


5.在更改数据库的文件存储位置时,需要先备份文件,然后在VSMGR中更改存储位置,然后停止SQL服务,然后删除原来的文件,然后重启服务及VSMGR,最后还原文件到指定位置即可。


6.可以使用对象池的BorrowDBConnection() 方法来从对象池借一个数据库连接, 然后通过调用对象池的ReturnDBConnection() 方法来返还数据库连接。


7.adapter.Fill(ds, "userData")  我们填充数据的时候不能直接填充到dataset里,必须把数据填充到datatable 上面的“userData” 就是要创建的datatable名字  如果使用adapter.fill(ds)方法的话 它会创建默认的table1  ,所以你指定第二个参数就等于给程序指定了你要创建的datatable名字,
不过你可以这样用
不适用dataset 使用datatable
DataTable dt=new DataTable(“userData”);
adapter.fill(dt);
这效果一样~~


8.c#函数参数里直接赋值,可选参数,是指给方法的特定参数指定默认值,在调用方法时可以省略掉这些参数。


9.BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用。使用这些API我们可以将Code与各种具体类型数据源进行解耦;使用这些Event我们可以洞察数据的变化。


10.使用DataRelation 通过DataColumn 对象将两个 DataTable 对象相互关联。例如在“客户/订单”关系中,客户表是关系的父表,订单表是子表。此关系类似于主键/外键关系。有关更多信息,请参见浏览表间关系

关系是在父表和子表中的匹配的列之间创建的。即,两个列的 DataType 值必须相同。

关系还可以将父级 DataRow 中的各种更改层叠到其子行。若要控制在子行中如何更改值,请将 ForeignKeyConstraint 添加到 DataTable 对象的 ConstraintCollectionConstraintCollection 确定在删除或更新父表中的值时采取什么操作。

在创建 DataRelation 时,它首先验证是否可以建立关系。在将它添加到 DataRelationCollection 之后,通过禁止会使关系无效的任何更改来维持此关系。在创建 DataRelation 和将其添加到DataRelationCollection 之间的这段时间,可以对父行或子行进行其他更改。如果这样会使关系不再有效,则会生成异常。

DataRelation 对象包含在 DataRelationCollection 中,后者可以通过DataSetRelations 属性、DataTable ChildRelations ParentRelations 属性来访问。

private void CreateRelation()
{
    // Get the DataColumn objects from two DataTable objects
    // in a DataSet. Code to get the DataSet not shown here.
    DataColumn parentColumn =
        DataSet1.Tables["Customers"].Columns["CustID"];
    DataColumn childColumn =
        DataSet1.Tables["Orders"].Columns["CustID"];
    // Create DataRelation.
    DataRelation relCustOrder;
    relCustOrder = new DataRelation("CustomersOrders",
        parentColumn, childColumn);
    // Add the relation to the DataSet.
    DataSet1.Relations.Add(relCustOrder);
}


11.语法 SET NOCOUNT { ON | OFF }

注释 当 SET NOCOUNT ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT OFF 时,返回计数。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。


12.如果你在程序里面写sql,就不要加分号,在程序里面编译器会把分号当做sql本身的一部分,所以会报错

如果是在查询工具里面(比如plsql),这个时候可以加上分号,在工具里面分号是个分隔符,看到分号就标志着本条sql语句结束了;

当然不加也可以,在工具里面看不到分号就认为本条sql没有结束。
比如:你写了两条sql,但是没有用分号隔开,此时,工具会当做一条来执行,只不过会报错而已。


13.存储过程中,使用insert into,需要先手动创建临时表

1.1 保存从select语句中返回的结果集createtable test_getdate(c1datetime)
insert into test_getdateselectGETDATE()
select *from test_getdate

1.2 保存从存储过程返回的结果集

insertinto #helpuserexec sp_helpuserselect*from #helpuser

1.3 保存从动态语句返回的结果集

insertinto test_dbccexec('DBCC TRACESTATUS')select*from test_dbcc


1.4不能嵌套使用insert exec语句


14.net use 文件路径 /user:账号 密码 /PERSISTENT:YES可以判断是否链接成功。


15.进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。

如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http:、https和file:标识符开头的uri。

WebClient类提供了UploadFile()和UploadData()方法,在需要投递HTML窗体或上传整个文件时候,就可以使用这两个方法。

webclient下载文件有两种方法,使用downloadfile()方法,应用程序需要处理从web站点检索的数据,为此要用到OpenRead方法。


16.在使用vs进行开发时,我们有时会使用Image.FromFile配合PictureBox来加载并显示图片,感觉挺方便,但是使用Image.FromFile有个小问题,加载完文件后不自动释放,导致再次操作被关联文件时候出现类似“文件xxx正由另一进程使用,因此该进程无法访问该文件。”的错误,因此当要对一个文件进行多次操作时,最好不要使用Image.FromFile 而使用Image.FromStream。

  1. pictureBox1.Image = Image.FromFile(filepath);  
  2. using (FileStream image = new FileStream(filepath, FileMode.Open))  
    {  
       pictureBox1.Image = Image.FromStream(image);  
      }  


17.SoundPlayer类是.NET Framework 2.0中新增的类,用于控制.wav文件中的声音播放。

spPass.Play();//播放.wav音频
spPass.Dispose();//释放由Conponent占用的资源
spPass.Equals();//判断两个object实例是否相等
spPass.GetType();//获取当前实例的Type
spPass.PlayLooping();//使用新线程循环播放.wav文件,若尚未加载.wav文件,则先加载该文件
spPass.Stop();//如果播放正在运行,则停止播放

player.SoundLocation = @"sound/Success.wav";

player.Load();
player.Play();


18.SQL中的cast 和convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能,只是语法不同。在时间转化中一般用到convert,因为它比cast多加了一个style,可以转化成不同时间的格式。

CAST ( expression AS data_type ), CONVERT (data_type[(length)], expression [, style]).


19.SQL中Like关键字用来模糊比较字符串,百分号%匹配0个或多个字符,下划线'_'匹配一个字符。还可以用方括号只匹配指定的某几个字符,例如[a-z],匹配小写字面。方括号中加入^表示匹配除指定字符以外的字符。


20.SQL right()函数返回最右边的len个字符的字符串str,或返回NULL如果任何参数是NULL。


21.Marshal提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。

命名空间:System.Runtime.InteropServices
程序集:mscorlib(在 mscorlib.dll 中)

Marshal 类中定义的 static 方法对于处理非托管代码至关重要。此类中定义的大多数方法通常由需要在托管和非托管编程模型之间提供桥梁的开发人员使用。例如, StringToHGlobalAnsi 方法将 ANSI 字符从指定的字符串(在托管堆中)复制到非托管堆中的缓冲区。该方法还分配大小正确的目标堆。


22.0xFFLU中,U 是 unsigned的简写,代表前面的FF是无符号数,L 是 long的简写,代表前面的FF是无符号长整形数。


23.如果存在三级继承,在基类中存在一个字段,如果第二级未赋值,而第三级赋值了,则可以直接在第二级中调用,前提是第三级赋值时未进行NEW覆盖,而是OVERIDE重写,或直接赋值。


24.在使用SQL SERVER本地数据库时,连接字符串一般用相对路径即可,虽有时数据库的地址在SQL SERVER的保存目录下,在程序运行时在程序本身BIN目录下有数据库映射体,但一般不影响数据库的使用,不过有些程序本身设置了的静态变量保存数据(如WINFORM),此时如果程序中没有相应的更新机制,则往往需要重启程序才能改变此静态变量,即保证此静态变量与数据库中一致。


25.设置本地的共享文件时,除注意共享的相关属性外,还应注意共享的一般引用模式为:主机IP地址+共享文件夹,如\\192.168.0.101\001,其中001为文件夹名称,且最后让该文件夹位于某个磁盘的根目录下,以避免与应用程序共享文件夹时出现锁死导致无权访问的情况。访问共享文件夹时需要本机的登录名称及密码。此时注意WIN10中的用户名与一般显示的账户名不同。此时还应注意网络地址\与一般物理地址/的区别。设置共享时,一定要注意赋予了那个用户共享,即用哪个账户登录时可以共享。否则容易登录或路径查找失败。

而访问共享文件的一般命令为:\\IP\001 /USER 用户名 密码/persistent:yes.


26.点开开始菜单,在搜索框中输入“cmd”,在搜索结果中,对着命令提示符程序,单击鼠标右键,菜单中点击选择“以管理员身份运行”。此时可以拥有较高的权限。


27.c#winform选择文件方法 OpenFileDialog fileDialog =new OpenFileDialog();fileDialog.Multiselect=true;fileDialog.Title="请选择文件";fileDialog.Filter="所有文件(*.*)|*.*";if (fileDialog.ShowDialog() == DialogResult.OK){string file=fileDialog.FileName;

c#winform选择文件夹方法 FolderBrowserDialog dialog =new FolderBrowserDialog();dialog.Description="请选择文件路径";if (dialog.ShowDialog() == DialogResult.OK){string foldPath = dialog.SelectedPath;

c#winform打开指定目录方法 System.Diagnostics.Process.Start("Explorer.exe","c:\\windows");


28.C# winform 遍历文件夹 List<string> fileNames = new List<string>();

     foreach  ( string  childPath  in  Directory.GetDirectories(path))
     {
         fileNames.AddRange(GetAllFile(childPath));
     }
  
     DirectoryInfo dir =  new  DirectoryInfo(path);
     foreach  (FileInfo file  in  dir.GetFiles())
     {
         fileNames.Add(file.Name);
     }


29.c#如何判断一个字符串变量是否在一个字符串数组 arr.Contains(str).


30. C# 获取文件名及扩展名

string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastIndexOf(".") - aFile.LastIndexOf("\\") - 1));  //文件名
string aLastName = aFile.Substring(aFile.LastIndexOf(".") + 1, (aFile.Length - aFile.LastIndexOf(".") - 1));   //扩展名


31.SQL 2008数据库,遇到一些问题。“您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项”开SQL 2008 在最上面工具-〉选项-〉左侧的 Designer-〉表设计器和数据库设计器 ->阻止保存要求重新创建表的更改(右侧)把钩去重新启动2008即可。


32.使用Group By子句的时候,一定要记住下面的一些规则:
(1)不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列
(2)Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数;
(3)不能Group By在表中不存在的列;
(4)进行分组前可以使用Where子句消除不满足条件的行;
(5)使用Group By子句返回的组没有特定的顺序,可以使用Order By子句指定次序。


33.DGV的相关问题。
33.1 设置某列的显示属性 datagrid.viewColumns[0].Visible = true;
33.2 列顺序莫名其妙改变 ,可以先把datasource置空值,或者设置列不能自动增加。


34.当控件被数据绑定时,无法以编程方式向   DataGridView   的行集合中添加行。

解决方法:

1、直接在dataset中增加的,dataset中增加,datagridview自然就增加了.

2、在数据绑定之前插入一个空行DataTable.Rows.insertat(DataTable.NewRow,位置),然后再绑定。 
3、直接DataTable.Rows.Add(DataTable.NewRow)就是在最后一行加入一个空白行

string[] strArray ={ textBox1.Text, textBox2.Text };
((DataTable)dataGridView1.DataSource).Rows.Add(strArray);  

4、添加一个 BindingSource所有的问题都解决了。首先是把数据源设给 BindingSource 的数据源。然后再把BindingSource设给 DataGridview 的数据源。需要使用BindingSource中转一下才可以。

5、调用datatable的insert方法插入到指定位置



35.实现IC的自动寻卡功能时,可以尝试设置时间间隔事件,以便实现动态寻卡。

36.CHECKBOX的全部选择功能需要试用FOREACH循环进行操作。

37. winform怎么设置combobox不允许输入,只允许下拉中选择呢? comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;


38.C#多个sql语句结果放在同一个dataGridView中, 联合查询。

string  sql =  "" ;
for ( int  h = 0;h < n;h ++) {
   if (h == 0)
     sql +=  "select * from t_teacher_card where kh = '"  + aa[h] + "' " ;
   else
     sql +=  " union all select * from t_teacher_card where kh = '"  + aa[h] + "' " ;
}
/*以下是你的查询结果和显示在dataGridView中的代码*/

39.c# 如何将字符串中用","分开的数字分别存入数组中  string[] str="1,2,3,11,12,13".Split(',');


40.判断datagridview中是否有某行被选中,语句为dgv1.SelectedRows.Count==0,此时注意DataGridView的SelectionMode属性为FullRowSelect。


41.一般扫描枪中内置ENTER事件,但此事件一般需要在各个键的事件中触发,因为事件中需要相应的参数。


42.sql server 备份失败[上加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇]                         

这句话的意思是,我的C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\路径下已经存在一个备份文件,不能有多个,所以解决方法就是直接覆盖原先的备份文件就好了。

只能有一个备份文件。


43.

LEFT JOIN :以左表为基础,显示左表中的所有列,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.

RIGHT JOIN:以右表为基础,显示右表中的所有列,不管是否与关联条件相匹配,而左表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.

FULL JOIN :显示多个表中的所有的列,不匹配关联条件的列以NULL字符填充.


44.超级用户的设置。 在设置用户角色的时候,往往需要设置超级用户,已达到数据库异常时可以登录系统进行操作。同时,这也从一定角度说明了软件系统与数据库分离设计的思想。即软件的运行应建立在数据库为空的基础上。


45.滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWheel 事件。

首先在窗体构造方法,里加入这样一句话

C#代码   收藏代码
  1. this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);  
然后写一个鼠标事件方法 。

最后通过e.Delta来引用鼠标滑动的大小。

对于如何将控件居中,则将控件的位置相应的加减一半即可。


46.CHARINDEX和PATINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。PATINDEX函数支持使用通配符来进行搜索,然而CHARINDEX不支持通佩符。

CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下:
       CHARINDEX ( expression1 , expression2 [ , start_location ] )
       Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
       CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0”。


47.能否对DataTable执行SQL语句,一般可以通过DT.SELECT()或者LINQ进行操作。


48. 今天在操作一个PICTUREBOX的缩放操作时较费劲,主要时更改DOCK属性时,其尺寸变化较大,后经确认,主要时没有提前确认好其尺寸。即在更改DOCK为FILL时,更改的尺寸是无效的。故如果需要更改其尺寸,需要先更改DOCK属性。


49.在操作鼠标拖放控件时,基本使用MouseDown、MouseUp、MouseMove三个事件。而且使用this.refresh()事件可以立即刷新,但注意放在那个事件中。

如果设置了整个窗体的DoubleBuffered属性为TRUE,即对控件进行双缓冲处理。则可以在一定程度上缓解控件闪烁问题。

另外,在MOUSEMOVE中设置控件的移动,而不是在MOUSEDOWN中设置控件的移动可以更好的改变控件的闪烁问题。

即在MOUSEDOWN事件中仅标记鼠标的坐标,而在MOUSEMOVE中标记控件的改变,这样在鼠标按下时就不会出现闪动现象了。


50.联合查询时如何对一个表进行分组。即SELECT的结果就是一个表。同时若跟条件子句,则条件中的字段一般用左连接的右表。

select a.品名,a.规格,a.数量,b.数量,c.数量
from 
(select 品名,规格,sum(数量)数量 from A group by 品名,规格)A inner join (select 品名,规格,sum(数量)数量 from B group by 品名,规格)B on a.品名=b.品名
inner join (select 品名,规格,sum(数量)数量 from C group by 品名,规格)C on a.品名=c.品名

51.

DataTable 修改列名 删除列 调整列顺序                           

  1. DataTable myDt =dt;  
  2. //删除列  
  3. myDt.Columns.Remove("minArea");  
  4. myDt.Columns.Remove("maxArea");  
  5.   
  6. //调整列顺序 ,列排序从0开始  
  7. myDt.Columns["num"].SetOrdinal(1);  
  8.   
  9. //修改列标题名称  
  10. dt.Columns["num"].ColumnName = "搜索量";  
  11. dt.Columns["rate"].ColumnName = "百分比";  

52.获取指定文件夹中的文件数量。

string [] files = Directory.GetFiles( "你所指的的文件" );
//文件的数量
int  fileNum = files.Lenght;

53.设置鼠标的形状。
即在鼠标的事件中设置Cursor属性即可。如Cursor = Cursors.Hand; 如何设置this.Cursor则会改变鼠标所在控件的形状。


54.TFS文件上传时,注意与本地映射地址的正确。

55.在进行程序文件变更时,若连接字符串等信息在程序外,即安装程序时会有一个文件夹,文件夹下除EXE文件外其他都是信息文件。因此,若程序文件有更改,仅替换EXE文件即可。若资源等信息有更改,则需要替换相应的文件。

56.对于WINFORM中的控件参数,一般时INT类型的,且属于短类型的,最大值为65535,因此,所有的控件基本无法超过此值。

57.窗体中控件的DOCK属性为NONE时,才能移动控件的位置,但此时窗体的最大化与最小化操作对该控件没有影响。只有DOCK属性为FILL时,窗体最大化与最小化操作才对控件的大小有影响,但此时不能更改控件相对窗体的位置。因此,为了实现各种需求,可以动态更改控件的DOCK属性。


58.e.KeyCode==Keys.Enter判断输入enter键。


59.创建复合主键,即可以在表设计器中选择两列进行设置,也可以进行如下操作:

方法一:创建表之后,alter table table_name add primary key(字段1,字段2)   

方法二:CREATE TABLE 表名 (字段名1 Int Not Null, 
                       字段名2 nvarchar(13) Not Null 
                       字段名3………… 
                       字段名N…………) 
    GO 

    ALTER TABLE 表名 WITH NOCHECK ADD  
    CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED  
     ( 
          [字段名1], 
          [字段名2] 
     ) 
    GO 


60.今天才发现,对于数据库操作,最方便的是在数据库中,而C#等语言的程序中对其操作,则是间接方法。因此,SQL语句还是比较重要的。


61.对于DATETIME格式的字段,如果单纯用来存储数据,还不如字符串来得方便,但若涉及到时间变更,则DATETIME有天然的优势,如DATETIME格式的变量M,则其前一天是M-1.


62.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值