segunda-feira, 22 de julho de 2013

SQL Server - Erro ao fazer INSERT OPENROWSET: "Cannot update. Database or object is read-only"

O erro "OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)" returned message "Cannot update.  Database or object is read-only." " ocorre ao tentar inserir registros de uma tabela em um arquivo do Excel.

Solução: retire o parâmetro IMEX=1 ou deixe-o IMEX=0.

Desta forma irá funcionar:
--------------------------
    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\teste.xls;HDR=YES;IMEX=0',
'Select Campo1, Campo2 From [Plan1$]')      
    Select Campo1
          ,Campo2
         from Tabela
------------------------

Obs: IMEX=1 funciona apenas para SELECT.

quinta-feira, 14 de março de 2013

SQL Server - entendendo o master.dbo.xp_dirtree para listar conteúdo de um diretório

No SQL Server, para listar os arquivos e pastas de um diretório, utilizamos o comando master.dbo.xp_dirtree

Esta procedure possui 3 parâmetros:

  1. Directory - este parâmetro indica o diretório cujo conteúdo você deseja listar
  2. Depth - este parâmetro indica quantos níveis de subpasta você deseja listar. 0 irá listar todas as subpastas.
    • 0 - lista todas as subpastas
    • 1 - lista somente a pasta indicada no parâmetro directory
    • 2- lista a pasta indicada no parâmetro directory + uma subpasta
    • ... e assim por diante
  3. File - indica o que você deseja listas no seu diretório:
    • 0 - somente pastas
    • 1 - pastas e arquivos
Esta procedure retorna 3 colunas
  • Name - nome do arquivo ou pasta
  • Depth - indica o nível em que o arquivo/pasta está (1 - está na pasta, 2 - está na subpasta, etc)
  • IsFile - 0 indica que é uma pasta e 1 indica que é um arquivo.

==================================================
Exemplo:
===================================================

Tenho a seguinte estrutura:
  • C:\Pasta1
    • Arquivo1.txt
    • Arquivo11.txt
    • Pasta2
      • Arquivo2.txt
      • Arquivo22.txt
      • Pasta3
        • Arquivo3.txt
        • Arquivo33.txt

O comando abaio irá listar todos os arquivos e pastas, mas somente no primeiro nível, ou seja, somente o conteúdo do diretório C:\Pasta. Não irá listar o conteúdo das sub-pastas.
--------------------------
CREATE TABLE #FileList(Name varchar(200), depth numeric, IsFile numeric) 
INSERT INTO #FileList exec master.dbo.xp_dirtree 'C:\Pasta1', 1, 1 

select * from #filelist
drop table #filelist
---------------------------

O comando abaixo irá listar o conteúdo da Pasta1 e o conteúdo da pasta2 (segundo nível)
exec master.dbo.xp_dirtree 'C:\Pasta1', 2, 1 


O comando abaixo irá listar o conteúdo da Pasta1 , pasta2 (segundo nível) e pasta 3 (terceiro nível)
exec master.dbo.xp_dirtree 'C:\Pasta1', 3, 1 


Caso você execute desta forma, a procedure irá retornar apenas as coluna Name e Depth, pois, uma vez que você não está listando arquivos, você não precisa da coluna IsFile.

exe master.dbo.xp_dirtree 'C:\Pasta1', 1, 0   
ou
exe master.dbo.xp_dirtree 'C:\Pasta1', 1


quinta-feira, 28 de fevereiro de 2013

Oracle - alterando o tempo de expiração da senha via SQLPLUS



Caso precise alterar o tempo de expiração da senha de algum usuário e a máquina não tiver o PL/SQL instalado, você pode fazer isso via SQLPLUS.

Pelo prompt de comando (MS-DOS), digite SQLPLUS <enter>

E entre com o usuário e senha que possua permissão para este tipo de operação.

Para alterar o tempo de expiração, precisamos primeiro identificar o PROFILE que o usuário faz parte:

SELECT PROFILE FROM dba_users WHERE username = 'SEU USUARIO'


Em seguida, executamos a alteração:

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME unlimited;


O parâmetro acima, seta o PROFILE para nunca expirar a senha. Caso queira apenas aumentar o limite, basta digitar a quantidade de dias para expiração no lugar do "unlimited".

Agora, verificamos se o parâmetro foi alterado:

SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT' AND RESOURCE_NAME='PASSWORD_LIFE_TIME'





quarta-feira, 30 de janeiro de 2013

SQL Server - como dar grant em todas as Procedures e Tabelas e SQL Profiler

Para gerar o script de grant de todas as tabelas e todas as procedures para um determinado usuário, utilize o exemplo abaixo, que irá retornar o script pronto para ser executado.

Mais abaixo, o script para dar grant create para o usuário, e grant para rodar o SQL Profiler.


--creating the script to grant in all tables
use [databasename]
go

SELECT 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' + NAME + ' TO ' + '[Domain\Username]'
  FROM SYSOBJECTS
WHERE TYPE = 'U'
  AND CATEGORY <> 2  -ignore system tables
ORDER BY NAME

Copie as linhas retornadas no select e execute


 

-- creating script to grant in all procedures
use [databasename]
go

declare @sql nvarchar(4000)
declare @db  sysname ; set @db = DB_NAME()
declare @u   sysname ; set @u = QUOTENAME('Domain\Username')
-- or -- declare @u   sysname ; set @u = QUOTENAME('username')
select 'grant exec on ' + QUOTENAME(ROUTINE_SCHEMA) + '.' +
QUOTENAME(ROUTINE_NAME) + ' TO ' + @u 
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'


Copie as linhas retornadas no select e execute


--grant create procedure
grant create procedure to [Domain\Username]


--grant to run SQL Profiler
grant alter trace to [Domain\User]




 

quarta-feira, 23 de janeiro de 2013

Rave Report - Como incluir totalizador de valores (Delphi 7)

VOU ADICIONAR AS IMAGENS POSTERIORMENTE.


Existem duas formas de incluir um totalizador de valores:

·         uma, a mais simples, é utilizando o CalcTextComponent

·         a outra, mais complexa, é utilizando o CalcComponent + Parâmetro + DataText .

O CalcTextComponent é mais simples de usar. Eu o descobri quando eu tentei adicionar um novo CalcComponent  no meu relatório e não funcionou. Na verdade, ele totalizava, mas não zerava o contador a cada novo agrupamento.


Utilizando o CalcTextComponent



Primeiro, devemos inserir uma Band totalizar os valores de um DataBand.

·         Acesse a aba Report

·         Clique no ícone do Band Component

·         Clique na Region do seu relatório para adicioná-lo.

·         Ele ficará posicionado embaixo das outras Bands. Se quiser mudar sua posição, clique nele com o botão direito e clique em  Order\Move Behind;

·         Clique na Band e defina um nome para ela, clicando na Propriedade Name no lado esquerdo da tela. Ex. Footer







Agora, vamos inserir o componente que irá calcular o total:

·         Acesse a aba Report;

·         Clique no ícone do cinza CalcTextComponent;

·         Clique na Band onde quer  ele seja mostrado no seu relatório (a Band inserida acima)

·         Clique no item adicionado e altere as seguintes propriedades:

o   CalcType: ctSum (para somar)

o   Controler: qual é o DataBand que exibe os valores que você deseja totalizar.

o   DataView: qual é o dataset que possui o campo que você deseja totalizar

o   DataField: qual campo você deseja totalizar

o   DisplayFormat: defina o formato em que o valor deve ser exibido

o   Fonte:  formatação para exibição

o   Name: defina um nome para o componente, para facilitar uma futura manutenção

o   Running Total:

§  FALSE – indica que ele ira zerar o totalizador após sair da Band atual.

§  TRUE – indica que ele irá acumular o valor

Como estamos criando um sub-total, vamos selecionar a opção FALSE.

Se quiser  criar um Total Geral, selecione TRUE.





Pronto. Agora é só salvar e executar o relatório.




Utilizando o CalcTotalComponent (opção mais complexa)



Primeiro, vamos inserir uma Parameter, que nada mais é que uma variável que irá acumular o total).

·         Clique no seu relatório (report componente)

·         Localize a propriedade Parameter do lado esquerdo da tela;

·         Clique no botão com três pontos [...]

·         Na tela Strings Editor, defina um nome para o seu parâmetro e clique em OK.




Em seguida, devemos inserir uma Band totalizar os valores de um DataBand.

·         Acesse a aba Report

·         Clique no ícone do Band Component

·         Clique na Region do seu relatório para adicioná-lo.

·         Ele ficará posicionado embaixo das outras Bands. Se quiser mudar sua posição, clique nele com o botão direito e clique em  Order\Move Behind;

·         Clique na Band e defina um nome para ela, clicando na Propriedade Name no lado esquerdo da tela. Ex. Footer



Agora, vamos inserir o componente que irá calcular o total:

·         Acesse a aba Report;

·         Clique no ícone verde CalcTotalComponent;

·         Clique na Band onde quer ele ele seja mostrado no seu relatório (a Band inserida acima);

·         Clique no item adicionado e altere as seguintes propriedades no lado esquerdo da tela:

o   CalcType: ctSum (para somar)

o   Controler: qual é o DataBand que exibe os valores que você deseja totalizar.

o   DataView: qual é o dataset que possui o campo que você deseja totalizar

o   DataField: qual campo você deseja totalizar

o   Destparam: é o parâmetro que receberá o valor totalizado (selecione o parâmetro cadastrado na etapa acima);

o   DisplayFormat: defina o formato em que o valor deve ser exibido

o   Fonte:  formatação para exibição

o   Name: defina um nome para o componente, para facilitar uma futura manutenção

o   Running Total:

§  FALSE – indica que ele ira zerar o totalizador após sair da Band atual.

§  TRUE – indica que ele irá acumular o valor

Como estamos criando um sub-total, vamos selecionar a opção FALSE.

Se quiser criar  um Total Geral, selecione TRUE.

 




Por último, vamos inserir o componente que vai exibir o valor calculado pelo CalcTotalComponent e armazenado no parâmetro (variável) do relatório.


·         Acesse a aba Report;

·         Clique no ícone cinza DataText;

·          Clique na Band onde quer ele ele seja mostrado no seu relatório (a Band na primeira etapa);

·         Clique no item adicionado  e altere as seguintes propriedades no lado esquerdo da tela:

o   DataField: selecione o parâmetro que possui o total acumulado.

§  Clique no botão com três pontos [...]

§  No painel Project Parameters, localize o parâmetro que foi cadastrado e clique no botão Insert Parameter

§  Clique em OK;






Pronto. Agora é só salvar e executar o relatório.


Caso tenha problemas na totalização com o CalcTotalComponent , utilize o CalcTextComponent.

quinta-feira, 17 de maio de 2012

Importar arquivos grandes no mysql

Importar arquivos grandes no mysql

Para importar arquivos grandes no mySQL é muito simples:


  • Abra o prompt do DOS;
  • Acesse o diretório mysql/bin/ e digite o seguinte comando:
mysql -h host -u usuario -p basededados < arquivo
  • -h digite o servidor, no meu caso: localhost
  • -u digite o nome do usuario que tem aceso ao banco (o usuário padrão do mysql é root  ;
  • basededados digite o nome do banco ao qual o arquivo irá colocar os registros
  • arquivo coloque o nome do arquivo e sua extensão

Depois de dar será solicitada a senha para acesso ao mysql. No caso do root, é só dar sem informar senha.

Fonte: Cantana

quinta-feira, 29 de setembro de 2011

Evitar erro ao dar OPENROWSET em XML com acentuação (SQL Server)

Para não ocorrer erro carregar um arquivo XML via OPENROWSET, quando o XML possui acentuação (Illegal Characters / Illegal Characters), basta adicionar o encoding na primeira linha do XML:

<?xml version="1.0" encoding = "ISO-8859-1" ?>





Bulk Insert e BCP / Queryout sem perder acentuação (SQL Server)

Para não perder a acentuação das palavras ao carregar um TXT via BULK INSERT ou ao exportar uma tabela via QUERYOUT, é necessário definir a CODEPAGE/COLLATION.

É simples:

BULK INSERT - Exemplo:
set @cmd = 'bulk insert TABELA from
''' + @FileName + ''' WITH (CODEPAGE = 1252)'
exec(@cmd)


BCP/QUERYOUT - Exemplo:


set @cmd = 'bcp "SELECT * FROM ##atu_conf" queryout ' + @FileName + ' -T -c -C1252 -t, '
EXEC xp_cmdshell @cmd

quinta-feira, 26 de maio de 2011

SQL Server - criar diretório via XP_CREATE_SUBDIR usando parâmetro

O comando xp_create_subdir 'c:\sua_pasta' funciona, mas se for criar um diretório/pasta utilizando uma variável, terá de fazer assim:


declare @dir varchar(30)
set @dir = 'c:\sua_pasta'
exec xp_create_subdir @dir

Caso contrário, retornará o erro Incorrect syntax near 'xp_create_subdir'.

sql server; xp_create_subdir; Incorrect syntax near xp_create_subdir;

quinta-feira, 19 de maio de 2011

Oracle 10g - recuperando uma tabela dropada

A partir da versão 10g do Oracle, é possível recuperar uma tabela que foi excluída (DROP), graças a uma tabela do sistema chamada RecycleBin e a um recurso chamado Flashback

Vamos ao Exemplo:

Crio uma tabela
create table Tabela1
(id integer, nome varchar(50));

Populo a tabela com alguns registros
insert into tabela1 (id, nome) values (1, 'Napa 1');
insert into tabela1 (id, nome) values (2, 'Napa 2');
insert into tabela1 (id, nome) values (3, 'Napa 2');
insert into tabela1 (id, nome) values (4, 'Napa 3');
COMMIT;

Consulto os dados da tabela
select * from tabela1

Agora dou um Drop na tabela
drop table tabela1

Tento dar um novo select na tabela: retornará erro
select * from tabela1

Note que ela fica armazenada na tabela recyclebin
select * from recyclebin

Para recuperar a tabela, executo o comando abaixo
flashback table tabela1 TO before DROP

Um novo select na tabela e os dados estarão lá
select * from tabela1


OBSERVAÇÕES IMPORTANTES

Os objetos dropados permanecem na tabela recyclebin até que:
- Seja restaurada através do comando UNDROP;
- Seja dropado permanentemente através do comando PURGE;
- Até que não tenha espaço suficiente para os objetos regulares na tablespace;
- As Contraints referencial não são protegidas pela recyclebin;

Observações extraídas de: ProfissionaisOracle.com.br

terça-feira, 17 de maio de 2011

SQL Server - exemplo simples de BulkInsert

CREATE TABLE [dbo].[CLIENTE](
[ID] [int] IDENTITY(1,1) NOT NULL,
[NOME] [nvarchar](100) NULL
) ON [PRIMARY]


Conteúdo a impordar: Arquivo CARGA.TXT
2;JOAQUIM;
3;MARIA;
4;PEDRO;

Abrir o MS-DOS e se logar no SQLCMD
sqlcmd -Useu_usuario -Psuasenha


BULK INSERT [Nome_da_Sua_Database].dbo.Cliente FROM "C:\CARGA.TXT"
WITH
(
FIRSTROW = 1,
FIELDTERMINATOR =";"
);
GO

Note que ele irá ignorar o ID informado, pois usará o IDENTITY da coluna ID.
Para fazer valer o ID do arquivo, adione o parâmetro KEEP_IDENTITY, dentro do WITH.

Pronto.

terça-feira, 26 de abril de 2011

Erro ao instalar Microsoft SQL Server 2008 Standard: MSXML 6.0 Parser (KB933579) -- Installation failed

Erro ao instalar Microsoft SQL Server 2008 Standard: MSXML 6.0 Parser (KB933579) -- Installation failed

Solução

- Desinstalar o MSXML 6 SP2 (Microsoft Core XML Services (MSXML) 6.0 SP2)
- Instalar o MSXML 6 disponível neste site
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=993C0BCF-3BCF-4009-BE21-27E85E1857B1&displaylang=en

Caso você não consiga desinstalar o MSXML6 SP2 (erro fatal durante desinstalação do MSXML6):

- Acesse o link abaixo e baixe o Fix it.


- Reinicie o computador. Em seguida, instale o MSXML6 do link acima.
- E para finalizar, inicie novamente a instalação do SQL Server 2008.

Felipe

Erro ao atualizar VS2008: Error 1935: An error occurred during the installation of the assembly

Erro ao atualizar visual studio 2008:
Error 1935: An error occurred during the installation of the assembly



Solução 1:
Reinicie a máquina e inicie novamente o VS2008 Setup.


Solução 2:

Se a solução 1 não funcionar:

1. Desabilite as atualizações automáticas do Windows (Menu Iniciar\Painel de Controle\Atualizações automáticas)

2. Desabilite o antivírus;
3. Inicie novamente a instalação/atualização do VS2008;

4. Quando finalizar a atualização, habilite novamente as atualizações automáticas (se desejar) e ative novamente o antivírus.

Fonte:
http://blogs.msdn.com/b/varungupta/archive/2007/11/27/visual-studio-2008-setup-fails-with-error-1935-an-error-occurred-during-the-installation-of-the-assembly.aspx


Visual Studio 2008 setup fails with "Error 1935: An error occurred during the installation of the assembly......."
Varun Gupta - MSFT
27 Nov 2007 3:07 AM


Sometimes this error occurs if windows update is scanning for updates at the same time as Visual Studio setup is installing components.


Workaround 1:

Reboot your machine and restart Visual Studio 2008 setup.


Workaround 2:

If Workaround 1 doesn’t work,

1. Reboot the machine

2. Disable windows update (start menu -> windows update)

3. Restart VS setup

4. When VS Setup is done, enable windows update (don't forget this step!)



If you run into any problems with either installation or uninstall, please make sure to post in the Visual Studio 2008 Setup and Installation Forum on MSDN.

sábado, 26 de fevereiro de 2011

Delphi - Stringrid multilinha

Código para StringGrid multilinha - quebrar o texto em linhas.

Depois, basta adicionar o + #13 entre o texto que você quer quebrar.

procedure TForm1.StringGrid1DrawCell(Sender: TObject;
Col, Row: Longint;
Rect: TRect;
State: TGridDrawState);

var
Line1: string;
Line2: string;
ptr: integer;
padding: integer;
begin

If (ACol > 0) and (ARow >0) Then
Begin
ptr := Pos(';', StringGrid1.Cells[ACol, ARow]);
if ptr > 0 then
begin
Line1 := Copy(StringGrid1.Cells[ACol, ARow], 1, ptr - 1);
Line2 := Copy(StringGrid1.Cells[ACol, ARow], ptr + 1,
Length(StringGrid1.Cells[ACol,ARow]) - ptr);
end
else
Line1 := StringGrid1.Cells[ACol, ARow];

StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top + 2, Line1);
if ptr > 0 then
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top -
StringGrid1.Canvas.Font.Height + 3, Line2);

End;

segunda-feira, 10 de janeiro de 2011

Instruções de Instalação do Indy10 para Delphi 7

Parece haver um bug na instalação do do Indy10 para Delphi 7.
Por isso, segue o passo a passo para instalar o Indy10 com sucesso.


DESINSTALANDO O INDY 7
Para o indy10 funcionar, você tem que desinstalar a versão antiga, senão, dará conflito ao compilar seu
código.

- Acesse o menu Component\Install Package
- Localize lingha "Internet Direct Indy for D7..."
- Clique nela e clique em REMOVE.

*Remova as DCU do Indy versão 7*
- Acesse a pasta C:\Arquivos de programas\Borland\Delphi7\Lib
- Apague todas as DCU iniciadas por Id (ID*.DCU). São aproximadamente 177 arquivos.
Obs.: Recomendo mover para uma outra pasta, para caso de precisar delas novamente.

INSTALANDO O INDY 10
- Feche o Delphi;
- Execute o indy10.1.5_d7.exe


CORRIGINDO A INSTALAÇÃO
- Abra o Delphi.
- Ele exibirá a mensagem "Cannot load package dclindycore70.bpl...", perguntando se deseja tentar abrí-la

novamente na próxima vez que iniciar o Dephhi. Clique em NÃO para todas as perguntas.
- Acesse o menu Tools\Environment Options;
- Na aba Library, clique no botão ao lado do Library Path;
- Verifique se a pasta C:\Arquivos de Programas\Indy for Delphi 7\LibD7 está na lista.
- Se não estiver, adicione.


REGISTRANDO OS PACOTES (DPK) DO COMPONENTE
- Acesse a pasta onde o Indy10 foi instalado (C:\Arquivos de Programas\Indy 10 for Delphi 7) e abra a

pasta Source. Lá existem 4 subpastas.

- Agora vamos compilar os pacotes (DPK) na ordem correta.
Apenas compilar! Você não conseguie instalá-los.


1. IndySystem70.dpk (pasta \System)
2. IndyCore70.dpk (pasta \Core)
3. IndyProtocols70.dpk (pasta \Protocols)
4. dclIndyCore70.dpk (pasta \Core)
5. dclIndyProtocols70.dpk (pasta \Protocols)


- Agora, acesse o menu Components\Install Package;
- Cliquem em ADD e adicione as duas BPL's da pasta C:\Arquivos de Programas\Indy for Delphi 7\LibD7:
- dclIndyCore70.bpl
- dclIndyProtocols.bpl

- Feche o Delphi e entre novamente.


Algumas instruções estão no link abaixo, mas não funciona exatamente como deveria:
http://www.indyproject.org/Sockets/Docs/indy10Installation.de.aspx