编写数据库操作类,使ASP.NET中的数据库操作变得简单

news/2025/3/22 1:17:21
  1None.gifASP.NET中一般都是使用SQL Server作为后台数据库。一般的ASP.NET数据库操作示例程序都是使用单独的数据访问,就是说每个页面都写连接到数据库,存取数据,关闭数据库的代码。这种方式带来了一些弊端,一个就是如果你的数据库改变了,你必须一个页面一个页面的去更改数据库连接代码。
  2None.gif第二个弊端就是代码冗余,很多代码都是重复的,不必要的。
  3None.gif因此,我试图通过一种一致的数据库操作类来实现ASP.NET种的数据访问。
  4None.gif
  5None.gif我们就拿一般网站上都会有的新闻发布系统来做例子,它需要一个文章数据库,我们把这个数据库命名为 News_Articles。新闻发布系统涉及到 发布新闻,展示文章,管理文章等。
  6None.gif
  7None.gif一篇文章一般都会有标题,作者,发表时间,内容,另外我们需要把它们编号。我们把它写成一个类,叫 Article 类,代码如下:
  8None.gif
  9None.gif//Article.cs
 10None.gifusing System;
 11None.gif
 12None.gifnamespace News_Articles.Data
 13ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 14ExpandedSubBlockStart.gifContractedSubBlock.gif /**//// <summary>
 15InBlock.gif /// Summary description for Article.
 16ExpandedSubBlockEnd.gif /// </summary>

 17InBlock.gif public class Article
 18ExpandedSubBlockStart.gifContractedSubBlock.gif dot.gif{
 19InBlock.gif  private int _id;   //文章编号
 20InBlock.gif  private string _author;  //文章的作者
 21InBlock.gif  private string _topic;  //文章的标题
 22InBlock.gif  private DateTime _postTime;  //文章的发表时间
 23InBlock.gif  private string _content;  //文章内容
 24InBlock.gif
 25InBlock.gif  public int ID
 26ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 27ExpandedSubBlockStart.gifContractedSubBlock.gif   get dot.gifreturn _id;}
 28ExpandedSubBlockStart.gifContractedSubBlock.gif   set dot.gif{ _id = value;}
 29ExpandedSubBlockEnd.gif  }

 30InBlock.gif  public string Author
 31ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 32ExpandedSubBlockStart.gifContractedSubBlock.gif   get dot.gifreturn _author; }
 33ExpandedSubBlockStart.gifContractedSubBlock.gif   set dot.gif{ _author = value; }
 34ExpandedSubBlockEnd.gif  }

 35InBlock.gif  public string Topic
 36ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 37ExpandedSubBlockStart.gifContractedSubBlock.gif   get dot.gifreturn _topic; }
 38ExpandedSubBlockStart.gifContractedSubBlock.gif   set dot.gif{ _topic = value; }
 39ExpandedSubBlockEnd.gif  }

 40InBlock.gif  public string Content
 41ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 42ExpandedSubBlockStart.gifContractedSubBlock.gif   get dot.gifreturn _content; }
 43ExpandedSubBlockStart.gifContractedSubBlock.gif   set dot.gif{ _content = value; }
 44ExpandedSubBlockEnd.gif  }

 45InBlock.gif  public DateTime PostTime 
 46ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 47ExpandedSubBlockStart.gifContractedSubBlock.gif   get dot.gifreturn _postTime; }
 48ExpandedSubBlockStart.gifContractedSubBlock.gif   set dot.gif{ _postTime = value; }
 49ExpandedSubBlockEnd.gif  }

 50ExpandedSubBlockEnd.gif }

 51ExpandedBlockEnd.gif}

 52None.gif
 53None.gif
 54None.gif然后我们写一个文章集合类 ArticleCollection
 55None.gif代码如下
 56None.gif
 57None.gif
 58None.gif 程序代码
 59None.gif
 60None.gif//ArticleCollection.cs
 61None.gifusing System[color=#0000ff];
 62None.gifusing System.Collections;
 63None.gif
 64None.gifnamespace News_Articles.Data
 65ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 66ExpandedSubBlockStart.gifContractedSubBlock.gif /**//// <summary>
 67InBlock.gif /// 文章的集合类,继承于 ArrayList
 68ExpandedSubBlockEnd.gif /// </summary>

 69InBlock.gif public class ArticleCollection : ArrayList
 70ExpandedSubBlockStart.gifContractedSubBlock.gif dot.gif{
 71InBlock.gif  public ArticleCollection() : base()
 72ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 73ExpandedSubBlockEnd.gif  }

 74InBlock.gif
 75InBlock.gif  public ArticleCollection(ICollection c) : base(c)
 76ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 77ExpandedSubBlockEnd.gif  }

 78ExpandedSubBlockEnd.gif }

 79ExpandedBlockEnd.gif}
[/color]
 80None.gif
 81None.gif
 82None.gif这个类相当于一个ASP.NET中的DataSet(其实两者很不一样),很简单,主要的目的是把将很多篇文章集合,以便在ASP.NET页面中给DataGrid或者DataList作为数据源,以显示文章。
 83None.gif
 84None.gif现在我们可以实现对News_Articles数据库的操作了,我说过,这是一个数据库操作类。不妨命名为 ArticleDb。实现如下:
 85None.gif
 86None.gif 程序代码
 87None.gif
 88None.gif//ArticleDb.cs
 89None.gifusing System;
 90None.gifusing System.Configuration;
 91None.gifusing System.Data;
 92None.gifusing System.Data.SqlClient;
 93None.gif
 94None.gifnamespace News_Articles.Data
 95ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 96ExpandedSubBlockStart.gifContractedSubBlock.gif /**//**//**//// <summary>
 97InBlock.gif /// 数据库操作类,实现文章数据库的读取,插入,更新,删除
 98ExpandedSubBlockEnd.gif /// </summary>

 99InBlock.gif public class ArticleDb
100ExpandedSubBlockStart.gifContractedSubBlock.gif dot.gif{
101InBlock.gif  private SqlConnection _conn;       //SQL Server 数据库连接
102InBlock.gif  private string   _articledb = "News_Articles"//SQL Server 文章数据库表
103InBlock.gif  
104ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
105InBlock.gif  /// 类的初始化,设置数据库连接
106ExpandedSubBlockEnd.gif  /// </summary>

107InBlock.gif  public ArticleDb()
108ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif
109InBlock.gif   _conn = new SqlConnection(ConfigurationSettings.AppSettings["connectionString"]);
110ExpandedSubBlockEnd.gif  }

111InBlock.gif
112ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
113InBlock.gif  /// 打开数据库连接
114ExpandedSubBlockEnd.gif  /// </summary>

115InBlock.gif  public void Open()
116ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
117InBlock.gif   if(_conn.State == ConnectionState.Closed)
118InBlock.gif    _conn.Open();
119ExpandedSubBlockEnd.gif  }

120InBlock.gif
121ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
122InBlock.gif  /// 关闭数据库连接
123ExpandedSubBlockEnd.gif  /// </summary>

124InBlock.gif  public void Close()
125ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
126InBlock.gif   if(_conn.State == ConnectionState.Open)
127InBlock.gif    _conn.Close();
128ExpandedSubBlockEnd.gif  }

129InBlock.gif
130ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
131InBlock.gif  /// 读取数据库中所有的 文章
132InBlock.gif  /// </summary>
133ExpandedSubBlockEnd.gif  /// <returns>ArticleCollection</returns>

134InBlock.gif  public ArticleCollection GetArticles()
135ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
136InBlock.gif   ArticleCollection articles = new ArticleCollection();
137InBlock.gif   string sql = "Select * FROM " + _articledb;
138InBlock.gif   SqlCommand cmd = new SqlCommand(sql,_conn);
139InBlock.gif   SqlDataReader dr = cmd.ExecuteReader();
140InBlock.gif   while(dr.Read())
141ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
142InBlock.gif    Article art = PopulateArticle(dr);
143InBlock.gif    articles.Add(art);
144ExpandedSubBlockEnd.gif   }

145InBlock.gif   dr.Close();
146InBlock.gif   return articles;
147ExpandedSubBlockEnd.gif  }

148InBlock.gif
149InBlock.gif
150ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
151InBlock.gif  /// 给定一个文章编号, 读取数据库中的一篇文章
152InBlock.gif  /// </summary>
153ExpandedSubBlockEnd.gif  /// <returns>Article</returns>

154InBlock.gif  public Article GetArticle(int articleId)
155ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
156InBlock.gif   string sql = "Select * FROM " + _articledb + "Where ID='" + articleId + "'";
157InBlock.gif   SqlCommand cmd = new SqlCommand(sql,_conn);
158InBlock.gif   SqlDataReader dr = cmd.ExecuteReader();
159InBlock.gif   Article article = PopulateArticle(dr);
160InBlock.gif   dr.Close();
161InBlock.gif   return article;
162ExpandedSubBlockEnd.gif  }

163InBlock.gif
164ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
165InBlock.gif  /// 更新数据库记录,注意需要设定文章的编号
166InBlock.gif  /// </summary>
167ExpandedSubBlockEnd.gif  /// <param name="article"></param>

168InBlock.gif  public void UpdateArticle(Article article)
169ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
170InBlock.gif   string sql = "Update " + _articledb +" SET Topic=@topic,Author=@author,Content=@content,PostTime=@postTime"
171InBlock.gif    + " Where ID = @articleId";
172InBlock.gif   SqlCommand cmd = new SqlCommand(sql,_conn);
173InBlock.gif
174InBlock.gif   cmd.Parameters.Add("@articleId",SqlDbType.Int,4).Value  = article.ID;
175InBlock.gif   cmd.Parameters.Add("@topic",SqlDbType.NVarChar,100).Value = article.Topic;
176InBlock.gif   cmd.Parameters.Add("@author",SqlDbType.NVarChar,100).Value = article.Author;
177InBlock.gif   cmd.Parameters.Add("@content",SqlDbType.NText).Value  = article.Content;
178InBlock.gif   cmd.Parameters.Add("@postTime",SqlDbType.DateTime).Value = article.PostTime;
179InBlock.gif
180InBlock.gif   cmd.ExecuteNonQuery();
181InBlock.gif
182ExpandedSubBlockEnd.gif  }

183InBlock.gif
184InBlock.gif
185ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
186InBlock.gif  /// 取出数据库中特定作者发表的文章
187InBlock.gif  /// </summary>
188InBlock.gif  /// <param name="author"></param>
189ExpandedSubBlockEnd.gif  /// <returns>ArticleCollection</returns>

190InBlock.gif  public ArticleCollection GetArticlesByAuthor(string author)
191ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
192InBlock.gif   string sql = "Select * FROM " + _articledb +" Where Author='" + author + "'";
193InBlock.gif   SqlCommand cmd = new SqlCommand(sql, _conn);
194InBlock.gif
195InBlock.gif   ArticleCollection articleCollection = new ArticleCollection();
196InBlock.gif
197InBlock.gif   SqlDataReader dr = cmd.ExecuteReader();
198InBlock.gif
199InBlock.gif   while (dr.Read())
200ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
201InBlock.gif    Article a = PopulateArticle(dr);
202InBlock.gif    articleCollection.Add(a);
203ExpandedSubBlockEnd.gif   }

204InBlock.gif   dr.Close();  
205InBlock.gif   return articleCollection;
206InBlock.gif   
207ExpandedSubBlockEnd.gif  }

208InBlock.gif
209InBlock.gif
210ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
211InBlock.gif  /// 删除给定编号的一篇文章
212InBlock.gif  /// </summary>
213ExpandedSubBlockEnd.gif  /// <param name="articleID"></param>

214InBlock.gif  public void DeleteArticle(int articleID)
215ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
216InBlock.gif   string sql = "Delete FROM " + _articledb + " Where ID='" + articleID + "'";
217InBlock.gif   SqlCommand cmd = new SqlCommand(sql, _conn);
218InBlock.gif   cmd.ExecuteNonQuery();
219ExpandedSubBlockEnd.gif  }

220InBlock.gif
221InBlock.gif 
222InBlock.gif
223InBlock.gif
224ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
225InBlock.gif  /// 通过 SqlDataReader 生成文章对象
226InBlock.gif  /// </summary>
227InBlock.gif  /// <param name="dr"></param>
228ExpandedSubBlockEnd.gif  /// <returns></returns>

229InBlock.gif  private Article PopulateArticle(SqlDataReader dr)
230ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
231InBlock.gif   Article art = new Article();
232InBlock.gif
233InBlock.gif   art.ID  = Convert.ToInt32(dr["ID"]);
234InBlock.gif   art.Author = Convert.ToString(dr["Author"]);
235InBlock.gif   art.Topic = Convert.ToString(dr["Topic"]);
236InBlock.gif
237InBlock.gif   art.Content = Convert.ToString(dr["Content"]);
238InBlock.gif   art.PostTime= Convert.ToDateTime(dr["PostTime"]);
239InBlock.gif
240InBlock.gif   return art;
241ExpandedSubBlockEnd.gif  }

242InBlock.gif
243InBlock.gif 
244InBlock.gif
245ExpandedSubBlockStart.gifContractedSubBlock.gif  /**//**//**//// <summary>
246InBlock.gif  /// 增加一篇文章到数据库中,返回文章的编号
247InBlock.gif  /// </summary>
248InBlock.gif  /// <param name="article"></param>
249ExpandedSubBlockEnd.gif  /// <returns>刚刚插入的文章的编号</returns>

250InBlock.gif  public int AddPost(Article article)
251ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{  
252InBlock.gif   string sql = "Insert INTO " + _articledb +"(Author,Topic,Content,PostTime)"+
253InBlock.gif    "VALUES(@author, @topic, @content, @postTime) "+
254InBlock.gif    "Select @postID = @@IDENTITY";
255InBlock.gif   SqlCommand cmd = new SqlCommand(sql,_conn);
256InBlock.gif   cmd.Parameters.Add("@postID",SqlDbType.Int,4);
257InBlock.gif   cmd.Parameters["@postID"].Direction = ParameterDirection.Output;
258InBlock.gif
259InBlock.gif   cmd.Parameters.Add("@author",SqlDbType.NVarChar,100).Value = article.Author;
260InBlock.gif   cmd.Parameters.Add("@topic",SqlDbType.NVarChar,400).Value = article.Topic;
261InBlock.gif   cmd.Parameters.Add("@content",SqlDbType.Text).Value   = article.Content;
262InBlock.gif   cmd.Parameters.Add("@postTime",SqlDbType.DateTime).Value = article.PostTime;
263InBlock.gif  
264InBlock.gif   cmd.ExecuteNonQuery();
265InBlock.gif
266InBlock.gif   article.ID = (int)cmd.Parameters["@postID"].Value;
267InBlock.gif   return article.ID;
268InBlock.gif   
269ExpandedSubBlockEnd.gif  }

270ExpandedSubBlockEnd.gif }

271ExpandedBlockEnd.gif}

272None.gif
273None.gif 
274None.gif
275None.gif基本的框架已经出来了。如果我们要在一个ASP.NET页面中显示文章数据库 News_Artices的数据,那么仅仅需要添加一个 DataGrid 或者 DataList,然后绑定数据源。例如
276None.gif在 Default.aspx 中添加一个 DataGrid ,命名为 ArticlesDataGrid,在 后台代码 Default.aspx.cs 中添加 
277None.gif
278None.gif 程序代码
279None.gifusing News_Articles.Data;
280None.gif
281None.gif
282None.gif并在 Page_Load 中添加如下的代码:
283None.gif
284None.gif
285None.gif 程序代码
286None.gifprivate void Page_Load(object sender, System.EventArgs e)
287ExpandedBlockStart.gifContractedBlock.gifdot.gif{
288InBlock.gif // Put user code to initialize the page here
289InBlock.gif ArticleDb myArticleDb = new ArticleDb();
290InBlock.gif myArticleDb.Open();
291InBlock.gif ArticleCollection articles = myArticleDb.GetArticles();
292InBlock.gif this.ArticlesDataGrid.DataSource = articles;
293InBlock.gif if(!Page.IsPostBack)
294ExpandedSubBlockStart.gifContractedSubBlock.gif dot.gif{
295InBlock.gif  this.ArticlesDataGrid.DataBind();
296ExpandedSubBlockEnd.gif }

297InBlock.gif
298InBlock.gif myArticleDb.Close();
299ExpandedBlockEnd.gif}

300None.gif
301None.gif
302None.gif这样就可以实现读取文章数据库中所有文章。
303None.gif如果需要删除一篇文章那么添加如下代码:
304None.gif
305None.gif 程序代码
306None.gif
307None.gif //删除编号为 1 的文章
308None.gif myArticleDb.DeleteArticle(1);
309None.gif
310None.gif插入一篇文章,代码如下:
311None.gif
312None.gif
313None.gif 程序代码
314None.gif  //插入一篇新的文章,不需要指定文章编号,文章编号插入成功后由SQL Server返回。
315None.gif Article newArticle  = new Article();
316None.gif newArticle.Author  = "Willmove";
317None.gif newArticle.Topic  = "测试插入一篇新的文章";
318None.gif newArticle.Content  = "这是我写的文章的内容";
319None.gif newArticle.PostTime = DateTime.Now;
320None.gif int articleId = myArticleDb.AddPost(newArticle);
321None.gif
322None.gif
323None.gif更新一篇文章,代码如下:
324None.gif 
325None.gif
326None.gif 程序代码
327None.gif  //更新一篇文章,注意需要指定文章的编号
328None.gif Article updateArticle  = new Article();
329None.gif updateArticle.ID = 3//注意需要指定文章的编号
330None.gif updateArticle.Author  = "Willmove";
331None.gif updateArticle.Topic  = "测试更新数据";
332None.gif updateArticle.Content  = "这是我更新的文章的内容";
333None.gif updateArticle.PostTime = DateTime.Now;
334None.gif myArticleDb.UpdateArticle(updateArticle);
335None.gif
336None.gif
337None.gif以上只是一个框架,具体的实现还有很多细节没有列出来。但是基于上面的框架,你可以比较方便的写出对数据库操作的代码。另外一个建议就是把上面的数据库访问的 SQL 语句写成数据库存储过程,比如 添加一篇文章:
338None.gif
339None.gif 程序代码
340None.gifCreate PROCEDURE AddPost
341None.gif(
342None.gif @ID  int OUTPUT,
343None.gif @Author nvarchar(100),
344None.gif @Topic nvarchar(100),
345None.gif @Content ntext,
346None.gif @PostTime datetime
347None.gif)
348None.gifAS
349None.gifInsert INTO News_Articles(Author, Topic, Content, PostTime) VALUES (@Author, @Topic, @Content, @PostTime);
350None.gif Select @ID = @@IDENTITY
351None.gifGO
352None.gif
353None.gif
354None.gif附1:News_Articles 数据库的字段
355None.gif
356None.gif
357None.gif 程序代码
358None.gif
359None.gif字段名 描述 数据类型 长度 是否可为空
360None.gifID 文章编号 int  4 否
361None.gifTopic 文章标题 nvarchar 100  否
362None.gifAuthor 作者 nvarchar 100 是
363None.gifContent 文章内容 ntext 16 否
364None.gifPostTime 发表时间 datetime 8 否
365None.gif
366None.gif其中 PostTime 的默认值可以设置为(getutcdate())
367None.gif
368None.gifSQL 语句是
369None.gif
370None.gif  Create TABLE [News_Articles] (
371None.gif [ID] [int] IDENTITY (11) NOT NULL ,
372None.gif [Topic] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
373None.gif [Author] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
374None.gif [Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
375None.gif [PostTime] [datetime] NOT NULL CONSTRAINT [DF_News_Articles_PostTime] DEFAULT (getutcdate())
376None.gif) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
377None.gifGO
378None.gif
379None.gif
380None.gif附2:News_Articles 项目源代码
381None.gif说明:打开项目文件 News_Articles.csproj 之前需要先设置 虚拟路径 News_Articles,或者在 News_Articles.csproj.webinfo 中更改设置。要正常运行还必须安装有SQL Server 并且安装了文章数据库 News_Articles。项目源代码的根目录下有 SQL 文本文件。
382None.gif
383None.gif

转载于:https://www.cnblogs.com/jhobo/archive/2006/09/15/505114.html


https://dhexx.cn/news/show-969713.html

相关文章

VMware7安装Fedora12的问题

Vmware一直是业内公认的专业虚拟机产品&#xff0c;它的许多功能&#xff0c;比如克隆、快照让我们程序员大大缩短了安装、调试OS的时间&#xff0c;一些喜欢冒险、从事危险实验的极客们也不用担心会对本地文件系统造成的损坏。网上有介绍说Vmware7增加了对Windows7的支持&…

Remoting學習(二)----用Reomoting 實現信息發送功能的代碼實現

昨天的那篇隨筆﹐全部是使用配置文件來實現的。那么根據配置文件﹐如何生成代碼訪問模式?1﹑首先將RemoteServer 和RemoteClient中的App.Config文件移除專案﹐注意是移除﹐不是刪除﹐要不﹐你以后要想再使用配置文件話﹐直接包含進來就可以啦。2﹑在frmServer的建構改為﹕pub…

VM7.0虚拟机安装Fodera12后上网设置(局域网上网)

首先在windows XP 中&#xff0c;查看所有的网络连接&#xff0c;你应该发现除了原有的网卡之外&#xff0c;又多了Vmnet1和Vmnet8。如果你看了一下说明书应该知道&#xff0c;vmnet1是hostonly的接口&#xff0c;而Vmnet8是使用NAT的网络接口。在这里我们既不想用VMWARE自带的…

[重要公告]成都.NET俱乐部

各位俱乐部会员大家好&#xff0e;  为了俱乐部的长期发展&#xff0c;经过一段时间的思考&#xff0c;现俱乐部和成都软件行业协会合作&#xff0e;以整合更多的资源&#xff0e;并正式命名为成都程序员俱乐部&#xff0e;目前成都程序员俱乐部将包括成都JAVA俱乐部&#xf…

近几天 用微芯力科的板子 调试usb虚拟串口的程序,发现一些问题以及解决方法。和大家共享

近几天 用微芯力科的板子 调试usb虚拟串口的程序&#xff0c;发现一些问题以及解决方法。和大家共享 主要问题是 串口有时收到乱码 有时收到丢包数据&#xff1a; 关于 乱码 我们其实很容易想到 奇偶校验的问题&#xff0c;而我们平常都是默认为没有奇偶校验。 请看程序…

STM32 USB 程序将BULK EP改成双缓冲机制后,接收OUT数据的速度从原先的500KB/S,

前天测试自己编写的USB驱动程序时候发现从主机到STM32的OUT传输&#xff08;主机到设备&#xff09;速率竟然只有最高33KB/S&#xff0c;实在是晕死了。经过研究后发现是驱动程序中设置的PIPE MaxTransferSize参数的关系&#xff0c;原先设置64只能33KB/S&#xff0c;后参考其他…

品味都市爱情

"爱情是什么&#xff1f;"这是一个萦绕在现代都市无数男女心头的问题。或许&#xff0c;在一个周末的下午&#xff0c;坐在咖啡厅或者情调酒吧里&#xff0c;眺望着窗外那熟悉而陌生的景致&#xff0c;静静地独自品尝手中的一杯热咖啡&#xff0c;你就可能发现答案。…

技术变革与方法论

因为部门培训的原因&#xff0c;我用了将近两个月的时间学习了一下SMS2003。测试了SMS的各种功能&#xff0c;得出的结论是&#xff1a;这项技术很难&#xff1b;在企业&#xff08;特别是中国的企业&#xff09;应用中不好推广。抛开技术的层面&#xff0c;微软在部署方面还是…

在C6000系列DSP中使用EMCV

emcv是OpenCV针对C6000系列DSP的移植版本&#xff0c;目前只完成了我们工作中用到的部分。下面对如何使用emcv做个简单的介绍&#xff1a;1. 找到一个可用的demo我们使用的是video_loopback例子&#xff0c;这个程序中DSP只是简单地将摄像头采集到的图像显示出来。显示的过程是…