Tradusido de The
Code Project Open License (CPOL)
Leia também
http://ronaldoeberle.blogspot.com.br/
http://ronaldoeberle.blogspot.com.br/
Neste artigo pretendo demonstrar como inserir e ler dados de um banco de dados SQL Server ou MSDE. Este código deve funcionar tanto no SQL Server, estou usando o 2000 e MSDE. Estou usando o Visual Studio 2002, mas isso deve funcionar com o Visual Studio 2003, Web Matrix, ea linha de comando SDK. Este código deve funcionar com ambos os # C aplicações e aplicações web de C # e WebServices. Esse código não compilar no FreeBSD com Rotor [^].
Background
Parte
do meu projeto atual exigiu-me muito armazenar e recuperar
informações de um banco de dados. Decidi usar C # como minha
linguagem alvo desde que eu estou lendo atualmente Dentro C #
Segunda Edição [^] por Tom Archer [^], que por sinal é necessário
ter um livro. No entanto, eu não poderia encontrar exemplos que
eram claras e apenas genérico acessando SQL Server com C #.
Usando o código
Eu
não incluir um aplicativo de exemplo porque o código de fornecer,
dentro do artigo pode realmente ser largadas e deve funcionar sem
nenhum problema. Também durante todo o artigo, vou me referir ao
SQL Server, MSDE é uma versão gratuita do SQL Server que não tem
algumas das ferramentas GUI e tem alguns limites, tais como o
tamanho do banco de dados. Este código irá trabalhar em ambos sem
problemas.
Fazendo a conexão Boa
Não
há mágica voodoo verdadeira para criar uma conexão com um
servidor SQL supondo que ele está configurado corretamente, o que
eu não sendo assunto desse artigo, na verdade. NET fez o trabalho
com SQL bastante fácil. O primeiro passo é adicionar o namespace
do cliente SQL:
SqlConnection
myConnection =
new
SqlConnection("user
id=username;"
+
"password=password;server=serverurl;"
+
"Trusted_Connection=yes;"
+
"database=database;
" +
"connection
timeout=30");
Note:
line break in connection string is for formatting purposes only
SqlConnection.ConnectionString
A seqüência de conexão é simplesmente uma compilação de opções
e os valores para especificar como e que se conectar. Após
investigar o Visual Studio. Arquivos de ajuda NET descobri que
vários campos teve vários nomes que trabalharam na mesma, como o
trabalho de senha e Pwd alternadamente. Eu não incluí todas as
opções para SqlConnection.ConnectionString neste momento. Como eu
tenho uma chance de testar e usar essas outras opções eu vou
incluí-los no artigo.
Nota do trdutor:
“Se pode conseguir o
strnig de conexão no Server Explorer propriedades.”
ID do usuário
A
identificação de usuário é usado quando você estiver usando a
autenticação SQL. Na minha experiência, isso é ignorado quando
se utiliza um Trusted_Connection, ou autenticação do Windows. Se o
nome de utilizador está associado com uma palavra-passe senha ou
PWD será usado.
"user
id=userid;"
Password or Pwd
O campo de
senha é para ser usado com o ID de usuário, ele simplesmente não
faria sentido entrar sem um nome de usuário, apenas uma senha.
Tanto a senha e Pwd são completamente intercambiáveis.
"Password=validpassword;"-or-
"Pwd=validpassword;"
"Pwd=validpassword;"
Data Source ou Servidos or endereço Address or Addr ou Network Address
Ao olhar na documentação do MSDN eu descobri
que existem várias maneiras de especificar o endereço de rede. A
documentação menciona nenhuma diferença entre eles e eles parecem
ser intercambiáveis. O endereço é um endereço de rede válido,
por brevidade só estou usando o endereço de localhost nos
exemplos.
"Data
Source=localhost;"
-or-
"Server=localhost;"
-or-
"Address=localhost;"-or-"Addr=localhost;"
-or-"Network Address=localhost;"
-or-
"Server=localhost;"
-or-
"Address=localhost;"-or-"Addr=localhost;"
-or-"Network Address=localhost;"
Integrated Sercurity or Trusted_Connection
Segurança
integrada e Trusted_Connection são usados para especificar o
wheter connnection é seguro, como a autenticação do Windows ou
SSPI. Os valores reconhecidos são true, false, e SSPI. De acordo
com o MSDN documentação sspi é equivalente a verdadeira. Nota: Eu
não sei como funciona SSPI, ou afeta a conexão.
Connect Timeout or Connection Timeout (Tempo de conexão)
Estes
especificar o tempo, em segundos, para aguardar a resposta do
servidor antes de gerar um erro. O valor padrão é 15 (segundos).
"Connect
Timeout=10;"-or-
"Connection Timeout=10;"
"Connection Timeout=10;"
Initial Catalog or Database (catalo inicila ou Base de dados)
"Inital
Catalog=main;"
-or-
"Database=main;"
-or-
"Database=main;"
Network Library or Net (Biblioteca de rede ou Net)
A opção de biblioteca de rede é essencial se você está se
comunicando com o servidor em um protocl diferente do TCP / IP. O
valor padrão para a biblioteca de rede é dbmssocn, ou TCP / IP. As
seguintes opções estão disponíveis: dbnmpntw (Named Pipes),
dbmsrpcn (Multiprotocol), dbmsadsn (Apple Talk), dbmsgnet (VIA),
dbmsipcn (memória compartilhada), e dbmsspxn (IPX / SPX), e
dbmssocn (TCP / IP). E, como antes de biblioteca de rede e Net pode
ser usuário de forma alternada. Nota: O protocolo de rede
correspondente deverá ser instalado no sistema ao qual você se
conectar.
SqlConnection.Open()
Execução de um Commando
Comandos SQL são provavelmente a parte mais difícil de usar um banco de dados SQL, mas o quadro. NET amarrou tudo se bem e leva a maior parte do trabalho da suposição fora.
SqlCommand
Algum palpite sobre o que SqlCommand é utilizado? Se você
adivinhou para os comandos SQL, então você está certo sobre. Um
SqlCommand precisa de pelo menos duas coisas para funcionar. A
cadeia de comando, e uma conexão. Primeiro vamos olhar para a
necessidade de conexão. Existem duas maneiras para especificar a
ligação, tanto são ilustrados abaixo:
SqlCommand
myCommand =
new
SqlCommand("Command
String",
myConnection);
//
- or
-
myCommand.Connection
= myConnection;
A sequência
de conexão também pode ser especificado em ambos os sentidos
usando a propriedade SqlCommand.CommandText. Agora vamos olhar para
nossa SqlCommand primeiro. Para mantê-lo simples
será um comando INSERT simples.
SqlCommand
myCommand= new
SqlCommand("INSERT
INTO table
(Column1,
Column2) "
+
"Values
('string', 1)",
myConnection);
//
- or
-
myCommand.CommandText
= "INSERT
INTO table
(Column1,
Column2) "
+
"Values
('string', 1)";
Agora vamos
dar uma olhada nos valores. tabela é simplesmente a tabela dentro
do banco de dados. Coluna1 e coluna2 são apenas os nomes das
colunas. Dentro dos valores seção eu demonstrei como inserir um
tipo string e um valor de tipo int. O valor da sequência é
colocado entre aspas simples e como você pode ver um número
inteiro é apenas passado como é. O passo final é para executar o
comando com:
myCommand.ExecuteNonQuery();
SqlDataReader
try
{
SqlDataReader
myReader =
null;
SqlCommand
myCommand =
new
SqlCommand("select
* from
table",
myConnection);
myReader
=
myCommand.ExecuteReader();
while(myReader.Read())
{
Console.WriteLine(myReader["Column1"].ToString());
Console.WriteLine(myReader["Column2"].ToString());
}
}
catch
(Exception e)
{
Console.WriteLine(e.ToString());
}
Como você pode ver o SqlDataReader não acessa o banco de dados,
ele apenas mantém os dados e fornece uma interface fácil de usar
os dados. O SqlCommand é bastante simples, a tabela é a tabela
você está usando para ler. Coluna1 e Coluna2 são apenas as
colunas como na tabela. Uma vez que há uma probabilidade muito alta
o seu vai estar lendo mais de uma linha de um loop while é
necessário para recuperar todos os registros. E como sempre você
quiser experimentá-lo e pegá-lo, assim você não quebrá-lo.
SqlParameter
SqlCommand
myCommand =
new SqlCommand(
"SELECT
* FROM
table WHERE
Column =
" +
input.Text,
myConnection);
É tudo muito bem e dândi, se o usuário coloca
na sintaxe correta, no entanto, o que acontece se o usuário coloca
drop table valor1,. Melhor cenário que irá causar uma exceção
(Eu não tenho verificado para ver o que este exemplo vai fazer, mas
demonstra um ponto), o pior caso você pode dar adeus a sua tabela.
Você poderia analisar todas as entradas do usuário e retirar tudo
o que poderia causar problemas ou você poderia usar um
SqlParameter. Agora a classe SqlParameter é muito grande, mas vou
apenas mostrar-lhe um uso parâmetro fundamental. Basicamente, você
precisa de três coisas para criar um parâmetro. Um nome, tipo de
dados e tamanho. (nota para alguns tipos de dados que você vai
querer deixar de fora o tamanho, como Texto).
SqlParameter
myParam =
new
SqlParameter("@Param1",
SqlDbType.VarChar,
11);
myParam.Value
= "Garden
Hose";
SqlParameter
myParam2 =
new
SqlParameter("@Param2",
SqlDbType.Int,
4);
myParam2.Value
= 42;
SqlParameter
myParam3 =
new
SqlParameter("@Param3",
SqlDbType.Text);
myParam.Value
= "Note
that I
am not
specifying size.
" +
"If
I did
that it
would trunicate
the text.";
É
convenção de nomenclatura, pode ser necessário eu não tenho
certeza, para citar todos os parâmetros que começam com o símbolo
@. Agora, como você usar um parâmetro? Será que o seu muito fácil
como mostra o código a seguir.
SqlCommand
myCommand =
new SqlCommand(
"SELECT
* FROM
table WHERE
Column =
@Param2",
myConnection);
myCommand.Parameters.Add(myParam2);
Agora isso mantém um usuário não autorizado de alta-jacking sua
cadeia de comando. Isso não é tudo que existe para os parâmetros
se você quer aprender tópicos mais avançados um bom lugar para
começar é aqui [^].
Não
se esqueça de fechar-se quando Termina!
Fechando uma conexão é
tão fácil como abri-lo. Apenas callSqlConnection.Close (), mas
lembre-se de colocá-lo em try / catch, porque como
SQLConnection.open () não retorna erros, mas lança uma exceção
em seu lugar.
try
{
myConnection.Close();
}
catch(Exception
e)
{
Console.WriteLine(e.ToString());
}
A conexão confiável sempre foi um mistério para mim, eu nunca havia imaginado porque nunca IIS e SQL Server pareciam estar se entendendo. Felizmente Pete (moredip) apontou uma seção útil da documentação. Para torná-lo mais simples eu decidi adicioná-la a este artigo. Vou dividir isso em 2 seções diferentes. IIS 6, e outras versões do IIS. Para começar o seu vai querer fazer osql.exe certeza é no caminho do sistema, ou encontrá-lo. Ele deve estar localizado onde o seu servidor SQL Server 2000 / cliente diretório de ferramentas. No meu sistema é algo como isto:%% diretório de instalação \ 80 \ Tools \ Binn \ Para simplificar, vou usar pseudo-variáveis nos exemplos de modo a não criar confusão.. Por exemplo, um pseudo-variável será parecido com este:% VARIÁVEL%. O servidor será referido como%% SERVER% INSTÂNCIA \%. Se você não estiver usando quaisquer nomes de instância, pode ser apenas%% SERVER, (local) se o servidor é a máquina local. Se você é nomes de instância seria algo como ServerName \ ServerInstance etc etc eu também estarei usando banco de dados%% para se referir ao nome do banco.
Eu sei que isso vai funcionar no IIS 6
com o Windows Server 2003, porque eu tenho feito isso e que é
atualmente o único SO com IIS 6. No IIS 6 o processo ASP.NET é
executado sob a conta 'NT AUTHORITY\NETWORK SERVICE'"
osql
-E -S %SERVER%\%INSTANCE% -d %DATABASE% -Q
"sp_grantdbaccess
'NT
AUTHORITY\NETWORK
SERVICE'"
osql
-E -S %SERVER%\%INSTANCE% -d %DATABASE% -Q
"sp_addrolemember
'db_owner', 'NT
AUTHORITY\NETWORK
SERVICE'"
IIS 5.1
Isso deve
funcionar em todos os outros do IIS 5.1 (possivelmente outras
versões) combinações. A única diferença entre o IIS 5.1 e IIS 6
é a conta do processo ASP.NET é executado. IIS 5.1 é executado em
uma MACHINENAME%% \ ASPNET onde% MACHINENAME% é o nome da máquina.
osql
-E -S
%SERVER%\%INSTANCE%
-Q
"sp_grantlogin
'%MACHINENAME%\ASPNET'"
Em ou uma
aplicação ASP.NET quando é possível logar no servidor. Qaundo
todos o acesson a todos as basese de dados.
osql
-E -S %SERVER%\%INSTANCE% -d %DATABASE%
-Q
"sp_grantdbaccess
'%MACHINENAME%\ASPNET'"
osql
-E -S %SERVER%\%INSTANCE% -d %DATABASE%
-Q
"sp_addrolemember
'db_owner',
'%MACHINENAME%\ASPNET'"
Completando
Agora você tem os conceitos básicos necessários para começar a
usar um banco de dados SQL em qualquer webapplications ou aplicações
desktop.
Este artigo não é de forma acabados. Eu pretendo expandir o artigo e adicionar um aplicativo de exemplo se o tempo permitir. Com informações sobre procedimentos armazenados, bem como uma conexão expandida seção de opções. Se você tiver alguma sugestão favor deixá-los no fórum abaixo
Este artigo não é de forma acabados. Eu pretendo expandir o artigo e adicionar um aplicativo de exemplo se o tempo permitir. Com informações sobre procedimentos armazenados, bem como uma conexão expandida seção de opções. Se você tiver alguma sugestão favor deixá-los no fórum abaixo
History
- 20 August 2004: Added a section on SqlParameters
- 25 February 2004: Added information on setting up permissions with IIS
- 2 July 2003: Revised connection string section
- 28 June 2003: Fixed a few typographical errors
- 27 June 2003: Initial Release
License
This
article, along with any associated source code and files, is licensed
under The
Code Project Open License (CPOL)
About the Author
United States Member |
|
Parte
inferior do formulário
Comments and Discussions
You must Sign In to use this message board. (secure sign-in) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
General
News
Suggestion
Question
Bug
Answer
Joke
Rant
Admin
Use
Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads,
Ctrl+Shift+Left/Right to switch pages.
Article Copyright
2003 by Matt Newman
Everything else Copyright © CodeProject, 1999-2012 Terms of Use
Everything else Copyright © CodeProject, 1999-2012 Terms of Use
Hot News: Signs
that you're a good programmer
Related Articles