假设要为额定功率为500VA,功率因数为0.9的负载配置UPS,根据假设的负载参数计算如下:
500VA/0.8=625VA(UPS驱动功率因数为-0.9的负载时,其驱动能力为额定功率的80%)
625VA/0.7=892.86VA(后备式UPS一般选取它额定功率的60%--70%的负载量)
625VA/0.8=781.25VA(在线式UPS一般选取它额定功率的70%--80%的负载量)
从计算结果来看,驱动额定功率为500VA,功率因数为0.9的负载时,若选用在线式UPS可选780VA以上的,若后备式UPS可选892VA以上的。
UPS的容量选择应考虑以下几个因素。
1. 实际负载情况
P=∑Pi/k (5-3)
即实际所有负载的总和,再加上一定的裕量。k为裕量系数,一般取1.1--1.3。
2)预留扩容:考虑到容IC交易网量发展的可能,在将来不追加设备和场地投资的前提下,增加运行设备
P=P*k (5-4)
式中k-----裕量系数,用户可根据实际情况掌握在1.1--1.3之间。
将UPS的负载功率因数当成了输出有功功率的百分比;实际上UPS约有功功率、无功功率和视在功率是直角三角形的勾股弦关系。比如UPS的负载功率因数PF=0.8时,视在功率S为lkVA的UPS可输出有功功率为
P=S*PF=800W
无功功率为
Q=S*√1-PF2=1*0.6=600var
而不是200var的无功功率。而且在双变换UPS正常工作时,带功率因数PF=l的线性负载时,逆变器只能给出80%的有功功率,而不是100。这是由逆变器的固有特性所决定的。
用非线性负载的视在功率相加值作标准去选功率因数不匹配的UPS,看起来似乎很有道理,但若功率因数没选对就有问题了。UPS带非线性负载的能力主要取决于它的无功功率。无功功率大,应付非线性负载的能力就强。因此,应当用无功功率作标准去选择UPS。
在查询分析器以“文本显示结果”方法执行
exec UspOutputData 你的表名
得到导出数据的语句,但image,text,ntext,sql_variant 列不出现在语句,以后改进。
存储过程UspOutputData如下:
CREATE PROCEDURE dbo.UspOutputData
@tablename sysname
AS
declare @column varchar(1000)
declare @columndata varchar(1000)
declare @sql varchar(4000)
declare @xtype tinyint
declare @name sysname
declare @objectId int
declare @objectname sysname
declare @ident int
set nocount on
set @objectId=object_id(@tablename)
if @objectId is null -- 判斷對象是否存在
begin
print 'The object not exists' pdf
return
end
set @objectname=rtrim(object_name(@objectId))
if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密
begin
print 'object not in current database'
return
end
if OBJECTPROPERTY(@objectId,'IsTable') <> 1 -- 判斷對象是否是pdftable
begin
print 'The object is not table'
return
end
select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' ON'
declare syscolumns_cursor cursor
for select c.name,c.xtype from syscolumns c
where c.id=@objectid
order by c.colid
open syscolumns_cursor
set @column=''
set @columndata=''
fetch next from syscolumns_cursor into @name,@xtype
while @@fetch_status <>-1
begin
if @@fetch_status<>-2
begin
if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理
begin
set @column=@column+case when len(@column)=0 then'' else ','end+@name
set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','end
+case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char
when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar
when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime
when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime
when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier
else @name end
end
end
fetch next from syscolumns_cursor into @name,@xtype
end
close syscolumns_cursor
deallocate syscolumns_cursor
set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename
print '--'+@sql
exec(@sql)
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' OFF'
GO
Sql Server 中 text或ntext 字段内容替换方法总结
update 表名
set text类型字段名=replace(convert(varchar(8000),text类型字段名),'要替换的字符','替换成的值')
1.update ntext:
(1)varchar和nvarchar类型是支持replace,所以如果你的text/ntext不超过8000/4000可以先转换成前面两种类型再使用replace。
update 表名
set text类型字段名=replace(convert(varchar(8000),text类型字段名),'要替换的字符','替换成的值')
update 表名
set ntext类型字段名=replace(convert(nvarchar(4000),ntext类型字段名),'要替换的字符','替换成的值')
(2)如果text/ntext超过8000/4000,看如下例子
declare @pos int
declare @len int
declare @str nvarchar(4000)
declare @des nvarchar(4000)
declare @count int
set @des ='<requested_amount+1>'--要替换成的值
set @len=len(@des)
set @str= '<requested_amount>'--要替换的字符
set @count=0--统计次数.
WHILE 1=1
BEGIN
select @pos=patINDEX('%'+@des+'%',propxmldata) - 1
from 表名
where 条件
IF @pos>=0
begin
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(字段名)
from 表名
where 条件
UPDATETEXT 表名.字段名 @ptrval @pos @len @str
set @count=@count+1
end
ELSE
break;
END
select @count
2.alter column语句有局限性,比如不允许修改text、image、ntext 或 timestamp 列.
以下提供一个修改ntext列的例子:
Alter Table tbl Add newcol ntext null
go
update tbl set newcol=col
go
EXEC sp_rename 'tbl.col', 'oldcol', 'COLUMN'
go
EXEC sp_rename 'tbl.newcol', 'col', 'COLUMN'
go
alter table tbl drop column oldcol
go
以上通过新增一列替换旧的列方法实现了将一个不允许为空的ntext修改为允许为空的ntext列(注意:以上的go不能缺少).修改表结构之后,由于视图所依赖的基础对象的更改,视图的持久元数据会过期,需要刷新视图,通过sp_refreshview (可以通过pdfsp_depends 找处相关的视图,再通过sp_refreshview逐个刷新).
另外可以也可以通过一下存储过程进行刷新所有视图:
PRINT 'Refreshing all views...'
DECLARE @vName sysname
DECLARE refresh_cursor CURSOR FOR
SELECT Name from sysobjects WHERE xtype = 'V'
order by crdate
FOR READ ONLY
OPEN refresh_cursor
FETCH NEXT FROM refresh_cursor
INTO @vName
WHILE @@FETCH_STATUS <> -1
BEGIN
exec sp_refreshview @vName
PRINT '视图' + @vName + ' refreshed'
FETCH NEXT FROM refresh_cursor
INTO @vName
END
CLOSE refresh_cursor
DEALLOCATE refresh_cursor
方法一(推荐):
update tablename set fieldA=replace(cast(fieldA as varchar(8000)) ,'aa','bb')这样的语句。
SQL中replace替换ntext,text字段部分内容使用说明:replace(cast(fieldA as varchar(8000)) ,'aa','bb')
方法二:
支持text字段处理的仅有:下面的函数和语句可以与 ntext、text 或 image 数据一起使用。
函数 语句
DATALENGTH READTEXT
PATINDEX SET TEXTSIZE
SUBSTRING UPDATETEXT
TEXTPTR WRITETEXT
TEXTVALID
主题:text字段
1:替换
--创建数据测试环境
create table #tb(aa text)
insert into #tb select 'abc123abc123,asd'
--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='123' --要替换的字符串和芯
,@d_str='000'--替换成的字符串
--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(aa),@rplen=len(@s_str),@postion=charindex(@s_str,aa)-1 from #tb
while @postion>0
begin
updatetext #tb.aa @p @postion @rplen @d_str
select @postion=charindex(@s_str,aa)-1 from #tb
end
32 位的操作系统只能用 4G 的内存(不确定这句话是否正确),因为 2 的 32 次方是 4G 。默认的情况下,操作系统给自己留了 2G ,剩下的 2G 给应用程序。所以,每个应用程序所能使用的内存,最大不超过 2G 。据说可以改 WINDOWS 的 BOOT.INI ,强制操作系统只使用 1G ,即使这样,应用程序也至多是 3G 。
SQL SERVER 就是这么个倒霉的应用程序。
就拿我们服务器来讲, OS : windows 2003; 内存: 8G; SQL:2008 。结果内存只用了不到 2G ,其中 SQL 是 1.7 G ,并且这个值基本没有什么变化。
太浪费了。
十月革命一声炮响,微软送来了 AWE 。这个东西可以让 32 位操作系统下的应用程序使用更多的内存。 SQL 支持 AWE 。
步骤:
1、 进入 SQL SERVER Management Studio
2、 右击数据库实例,选内存
3、 勾上“使用 AWE 分配内存”,填上合适的最小和最大内存(具体是什么标准不清楚,我是给操作系统预留了 2G; 有的内存紧张的服务器只留 1G, 甚至只有 500M ,也没发现什么问题)
4、 重启和芯数据库实例。
之后用任务管理器查看,内存消耗越来越多,直至比设定值大一点点。很奇怪,这时看 SQL 消耗的内存,只有几十 M ,不知道这个数值怎么来的。估计是分配的内存之外消耗的吧?
在性能监视器(管理工具 - 性能)上看到,磁盘队列大大减少了,实际应用,网站快了许多。
问题:
1、通常 Windows Server 服务器默认的设置不支持使用 2G 以上的内存,即使硬件的内存有超过2G,但是实际使用的时候也不会用到2G
2、多核CPU处理单个程序时,很多时候只是其中一个核CPU有在使用,其他都没有发挥作用
为了充分使用服务器内存和买卖IC网CPU的效率,需要做设置:
第一步:修改 windwos 启动配置文件: c:\boot.ini
增加如下红色文字部分设置
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" execute=optin /fastdetect /PAE /AWE
第二步:SQL Server 2005 管理器(SQL Server Management Studio Express),选择服务器鼠标右键属性,选择“内存”页,勾选“使用AWE分配内存”
第三步:我的电脑,鼠标右键:系统属性——高级——设置——高级
处理器计划:勾选“程序”
内存使用:勾选“程序”
第四步:重启服务器
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
namespace DirectoryApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Fun with Directory(Info) *****\n");
ShowWindowsDirectoryInfo();
Console.ReadLine();
DisplayImageFiles();
Console.ReadLine();
ModifyAppDirectory();
Console.ReadLine();
FunWithDirectoryType();
Console.ReadLine();
}
#region Show basic directory info
static void ShowWindowsDirectoryInfo()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
// Dump directory information.
Console.WriteLine("***** Directory Info *****");
Console.WriteLine("FullName: {0}", dir.FullName);
Console.WriteLine("Name: {0}", dir.Name);
Console.WriteLine("Parent: {0}", dir.Parent);
Console.WriteLine("Creation: {0}", dir.CreationTime);
Console.WriteLine("Attributes: {0}", dir.Attributes);
Console.WriteLine("Root: {0}", dir.Root);
Console.WriteLine("**************************\n");
}
#endregion
#region Show info on image typesIC
static void DisplayImageFiles()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows\Web\Wallpaper");
// Get all files with a *.bmp extension.
FileInfo[] imageFiles = dir.GetFiles("*.jpg");
// How many were found?
Console.WriteLine("Found {0} *.jpg files\n", imageFiles.Length);
// Now print out info for each file.
foreach (FileInfo f in imageFiles)
{
Console.WriteLine("***************************");
Console.WriteLine("File name: {0}", f.Name);
Console.WriteLine("File size: {0}", f.Length);
Console.WriteLine("Creation: {0}", f.CreationTime);
Console.WriteLine("Attributes: {0}", f.Attributes);
Console.WriteLine("***************************\n");
}
}
#endregion
#region Modify directory structure
static void ModifyAppDirectory()
{
DirectoryInfo dir = new DirectoryInfo(".");
// Create \MyFolder off initial directory.
dir.CreateSubdirectory("MyFolder");
// Capture returned DirectoryInfo object.
DirectoryInfo myDataFolder = dir.CreateSubdirectory(@"MyFolder2\Data");
// Prints path to ..\MyFolder2\Data.
Console.WriteLine("New Folder is: {0}", myDataFolder);
}
#endregion
#region Using Directory type
static void FunWithDirectoryType()
{
// List all drives on current computer.
string[] drives = Directory.GetLogicalDrives();
Console.WriteLine("Here are your drives:");
foreach (string s in drives)
Console.WriteLine("--> {0} ", s);
// Delete what was created.
Console.WriteLine("Press Enter to delete directories");
Console.ReadLine();
try
{
Directory.Delete(string.Format(@"{0}\MyFolder", IC
Environment.CurrentDirectory));
// The second parameter specifies if you
// wish to destroy any subdirectories.
Directory.Delete(string.Format(@"{0}\MyFolder2",
Environment.CurrentDirectory), true);
}
catch (IOException e)
{
Console.WriteLine(e.Message);
}
}
#endregion
}
}
Dictionary<string, string>是一个泛型
他本身有集合的功能有时候可以把它看成数组
他的结构是这样的:Dictionary<[key], [value]>
他的特点是存入对象是需要与[key]值一一对应的存入该泛型
通过某一个一定的[key]去找到对应的值
举个例子:
//实例化对象
Dictionary<int, string> dic = new Dictionary<int, string>();
//对象打点添加
dic.Add(1, "one");
dic.Add(2, "two");
dic.Add(3, "one");
//提取元素的方法
string a = dic[1];
string b = dic[2];
string c = dic[3];
//1、2、3是键,分别对应“one”“two”“one”
//上面代码中分别把值赋给了a,b,c
//注意,键相当于找到对应值的唯一标识,所以不能重复
//但是值可以重复
如果你还看不懂我最后给你举一个通俗的例子
有一缸米,你想在在每一粒上都刻上标记,不重复,相当于“键”当你找的时候一一对应不会找错,这就是这个泛型的键的-作用,而米可以一样,我的意思 你明白了吧?
-------------------------------------------------------------------------
c# 对dictionary类进行排序用什么接口实现
如果使用.Net Framework 3.5的话,事情就很简单了。呵呵。
如果不是的话,还是自己写排序吧。
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace DictionarySorting
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "HaHa");
dic.Add(5, "HoHo");
dic.Add(3, "HeHe");
dic.Add(2, "HiHi");
dic.Add(4, "HuHu");
var result = from pair in dic orderby pair.Key select pair;
foreach (KeyValuePair<int, string> pair in result)
{
Console.WriteLine("Key:{0}, Value:{1}", pair.Key, pair.Value);
}
Console.ReadKey();
}
}
}
【执行结果】
Key:1, Value:HaHa
Key:2, Value:HiHi
Key:3, Value:HeHe
Key:4, Value:HuHu
Key:5, Value:HoHo
Dictionary的基本用法。假如
需求:现在要导入买卖IC网一批数据,这些数据中有一个称为公司的字段是我们数据库里已经存在了的,目前我们需要把每个公司名字转为ID后才存入数据库。
分析:每导一笔记录的时候,就把要把公司的名字转为公司的ID,这个不应该每次都查询一下数据库的,因为这太耗数据库的性能了。
解决方案:在业务层里先把所有的公司名称及相应的公司ID一次性读取出来,然后存放到一个Key和Value的键值对里,然后实现只要把一个公司的 名字传进去,就可以得到此公司相应的公司ID,就像查买卖IC网字典一样。对,我们可以使用字典Dictionary操作这些数据。
示例:SetKeyValue()方法相应于从数据库里读取到了公司信息。
/// <summary>
/// 定义Key为string类型,Value为int类型的一个Dictionary
/// </summary>
/// <returns></returns>
protected Dictionary<string, int> SetKeyValue()
{
Dictionary<string, int> dic = new Dictionary<string, int>();
dic.Add("公司1", 1);
dic.Add("公司2", 2);
dic.Add("公司3", 3);
dic.Add("公司4", 4);
return dic;
}
/// <summary>
/// 得到根据指定的Key行到Value
/// </summary>
protected void GetKeyValue()
{
Dictionary<string, int> myDictionary = SetKeyValue();
//测试得到公司2的值
int directorValue = myDictionary["公司2"];
Response.Write("公司2的value是:" + directorValue.ToString());
}
以前在使用VB来实现多线程的 时候,发现有一定的难度。虽然也有这样那样的方法,但都不尽人意,但在C#中,要编写多线程应用程序却相当的简单。这篇文章将作简要的介绍,以起到抛砖引 玉的作用!
.NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。
即使你没有编写多线程应用程序的经验,也可能听说过“启动线程”“杀死线程”这些词,其实除了这两个外,涉及多线程方面的还有诸如“暂停线程”“优先级” “挂起线程”“恢复线程”等等。下面将一个一个的解释。
a.启动线程
顾名思义,“启动线程”就是新建并启动一个线程的意思,如下代码可实现:
Thread thread1 = new Thread(new ThreadStart( Count));
其中的 Count 是将要被新线程执行的函数。
b.杀死线程
“杀死线程”就是将一线程斩草除根,为了不白费力气,在杀死一个线程前最好先判断它是否还活着(通过 IsAlive 属性),然后就可以调用 Abort 方法来杀死此线程。
c.暂停线程
它的意思就是让一个正在运行的线程休眠一段时间。如 thread.Sleep(1000); 就是让线程休眠1秒钟。
d.优先级
这个用不着解释了。Thread类中有一个ThreadPriority属性,它用来设置优先级,但不能保证操作系统会接受该优先级。一个线程的优先级可 分为5种:Normal, AboveNormal, BelowNormal, Highest, Lowest。具体实现例子如下:
thread.Priority = ThreadPriority.Highest;
e.挂起线程
Thread类的Suspend方法用来挂起线程,知道调用Resume,此线程才可以继续执行。如果线程已经挂起,那就不会起作用。
if (thread.ThreadState = ThreadState.Running)
{
thread.Suspend();
}
f. 恢复线程
用来恢复已经挂起的线程,以让它继续执行,如果线程没挂起,也不会起作用。
if (thread.ThreadState = ThreadState.Suspended)
{
thread.Resume();
}
下面将列出一个买卖IC网例子,以说明简单的线程处理功能。此例子来自于帮助文档。
using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample {
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
public static void ThreadProc() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}
public static void Main() {
Console.WriteLine("Main thread: Start a second thread.");
// The constructor for the Thread class requires a ThreadStart
// delegate that represents the method to be executed on the
// thread. C# simplifies the creation of this delegate.
Thread t = new Thread(new ThreadStart(ThreadProc));
// Start ThreadProc. On a uniprocessor, the thread does not get
// any processor time until the main thread yields. Uncomment
// the Thread.Sleep that follows t.Start() to see the difference.
t.Start();
//Thread.Sleep(0);
for (int i = 0; i < 4; i++) {
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
此代码产生的输出类似如下买卖IC网内容:
Main thread: Start a second thread. Main thread: Do some work. ThreadProc: 0 Main thread: Do some work. ThreadProc: 1 Main thread: Do some work. ThreadProc: 2 Main thread: Do some work. ThreadProc: 3 Main thread: Call Join(), to wait until ThreadProc ends. ThreadProc: 4 ThreadProc: 5 ThreadProc: 6 ThreadProc: 7 ThreadProc: 8 ThreadProc: 9 Main thread: ThreadProc.Join has returned. Press Enter to end program.

